| OLD | NEW |
| (Empty) |
| 1 dart_library.library('dart/_isolate_helper', null, /* Imports */[ | |
| 2 "dart_runtime/dart", | |
| 3 'dart/core', | |
| 4 'dart/_interceptors', | |
| 5 'dart/_js_helper', | |
| 6 'dart/isolate', | |
| 7 'dart/_foreign_helper', | |
| 8 'dart/collection', | |
| 9 'dart/async' | |
| 10 ], /* Lazy imports */[ | |
| 11 'dart/_native_typed_data', | |
| 12 'dart/_js_embedded_names' | |
| 13 ], function(exports, dart, core, _interceptors, _js_helper, isolate, _foreign_he
lper, collection, async, _native_typed_data, _js_embedded_names) { | |
| 14 'use strict'; | |
| 15 let dartx = dart.dartx; | |
| 16 function _serializeMessage(message) { | |
| 17 return new _Serializer().serialize(message); | |
| 18 } | |
| 19 dart.fn(_serializeMessage); | |
| 20 function _deserializeMessage(message) { | |
| 21 return new _Deserializer().deserialize(message); | |
| 22 } | |
| 23 dart.fn(_deserializeMessage); | |
| 24 function _clone(message) { | |
| 25 let serializer = new _Serializer({serializeSendPorts: false}); | |
| 26 let deserializer = new _Deserializer(); | |
| 27 return deserializer.deserialize(serializer.serialize(message)); | |
| 28 } | |
| 29 dart.fn(_clone); | |
| 30 let _serializeSendPorts = Symbol('_serializeSendPorts'); | |
| 31 let _workerId = Symbol('_workerId'); | |
| 32 let _isolateId = Symbol('_isolateId'); | |
| 33 let _receivePortId = Symbol('_receivePortId'); | |
| 34 let _id = Symbol('_id'); | |
| 35 let _receivePort = Symbol('_receivePort'); | |
| 36 class _Serializer extends core.Object { | |
| 37 _Serializer(opts) { | |
| 38 let serializeSendPorts = opts && 'serializeSendPorts' in opts ? opts.seria
lizeSendPorts : true; | |
| 39 this.serializedObjectIds = core.Map$(dart.dynamic, core.int).identity(); | |
| 40 this[_serializeSendPorts] = dart.as(serializeSendPorts, core.bool); | |
| 41 } | |
| 42 serialize(x) { | |
| 43 if (dart.notNull(this.isPrimitive(x))) | |
| 44 return this.serializePrimitive(x); | |
| 45 let serializationId = this.serializedObjectIds.get(x); | |
| 46 if (serializationId != null) | |
| 47 return this.makeRef(serializationId); | |
| 48 serializationId = this.serializedObjectIds.length; | |
| 49 this.serializedObjectIds.set(x, serializationId); | |
| 50 if (dart.is(x, _native_typed_data.NativeByteBuffer)) | |
| 51 return this.serializeByteBuffer(dart.as(x, _native_typed_data.NativeByte
Buffer)); | |
| 52 if (dart.is(x, _native_typed_data.NativeTypedData)) | |
| 53 return this.serializeTypedData(dart.as(x, _native_typed_data.NativeTyped
Data)); | |
| 54 if (dart.is(x, _interceptors.JSIndexable)) | |
| 55 return this.serializeJSIndexable(dart.as(x, _interceptors.JSIndexable)); | |
| 56 if (dart.is(x, _js_helper.InternalMap)) | |
| 57 return this.serializeMap(dart.as(x, core.Map)); | |
| 58 if (dart.is(x, _interceptors.JSObject)) | |
| 59 return this.serializeJSObject(dart.as(x, _interceptors.JSObject)); | |
| 60 if (dart.is(x, _interceptors.Interceptor)) | |
| 61 this.unsupported(x); | |
| 62 if (dart.is(x, isolate.RawReceivePort)) { | |
| 63 this.unsupported(x, "RawReceivePorts can't be transmitted:"); | |
| 64 } | |
| 65 if (dart.is(x, _NativeJsSendPort)) | |
| 66 return this.serializeJsSendPort(dart.as(x, _NativeJsSendPort)); | |
| 67 if (dart.is(x, _WorkerSendPort)) | |
| 68 return this.serializeWorkerSendPort(dart.as(x, _WorkerSendPort)); | |
| 69 if (dart.is(x, core.Function)) | |
| 70 return this.serializeClosure(dart.as(x, core.Function)); | |
| 71 return this.serializeDartObject(x); | |
| 72 } | |
| 73 unsupported(x, message) { | |
| 74 if (message === void 0) | |
| 75 message = null; | |
| 76 if (message == null) | |
| 77 message = "Can't transmit:"; | |
| 78 dart.throw(new core.UnsupportedError(`${message} ${x}`)); | |
| 79 } | |
| 80 makeRef(serializationId) { | |
| 81 return ["ref", serializationId]; | |
| 82 } | |
| 83 isPrimitive(x) { | |
| 84 return x == null || typeof x == 'string' || dart.is(x, core.num) || typeof
x == 'boolean'; | |
| 85 } | |
| 86 serializePrimitive(primitive) { | |
| 87 return primitive; | |
| 88 } | |
| 89 serializeByteBuffer(buffer) { | |
| 90 return ["buffer", buffer]; | |
| 91 } | |
| 92 serializeTypedData(data) { | |
| 93 return ["typed", data]; | |
| 94 } | |
| 95 serializeJSIndexable(indexable) { | |
| 96 dart.assert(!(typeof indexable == 'string')); | |
| 97 let serialized = dart.as(this.serializeArray(dart.as(indexable, _intercept
ors.JSArray)), core.List); | |
| 98 if (dart.is(indexable, _interceptors.JSFixedArray)) | |
| 99 return ["fixed", serialized]; | |
| 100 if (dart.is(indexable, _interceptors.JSExtendableArray)) | |
| 101 return ["extendable", serialized]; | |
| 102 if (dart.is(indexable, _interceptors.JSMutableArray)) | |
| 103 return ["mutable", serialized]; | |
| 104 if (dart.is(indexable, _interceptors.JSArray)) | |
| 105 return ["const", serialized]; | |
| 106 this.unsupported(indexable, "Can't serialize indexable: "); | |
| 107 return null; | |
| 108 } | |
| 109 serializeArray(x) { | |
| 110 let serialized = []; | |
| 111 serialized[dartx.length] = x[dartx.length]; | |
| 112 for (let i = 0; dart.notNull(i) < dart.notNull(x[dartx.length]); i = dart.
notNull(i) + 1) { | |
| 113 serialized[dartx.set](i, this.serialize(x[dartx.get](i))); | |
| 114 } | |
| 115 return serialized; | |
| 116 } | |
| 117 serializeArrayInPlace(x) { | |
| 118 for (let i = 0; dart.notNull(i) < dart.notNull(x[dartx.length]); i = dart.
notNull(i) + 1) { | |
| 119 x[dartx.set](i, this.serialize(x[dartx.get](i))); | |
| 120 } | |
| 121 return x; | |
| 122 } | |
| 123 serializeMap(x) { | |
| 124 let serializeTearOff = dart.bind(this, 'serialize'); | |
| 125 return ['map', x.keys[dartx.map](dart.as(serializeTearOff, __CastType0))[d
artx.toList](), x.values[dartx.map](dart.as(serializeTearOff, dart.functionType(
dart.dynamic, [dart.dynamic])))[dartx.toList]()]; | |
| 126 } | |
| 127 serializeJSObject(x) { | |
| 128 if (!!x.constructor && x.constructor !== Object) { | |
| 129 this.unsupported(x, "Only plain JS Objects are supported:"); | |
| 130 } | |
| 131 let keys = dart.as(Object.keys(x), core.List); | |
| 132 let values = []; | |
| 133 values[dartx.length] = keys[dartx.length]; | |
| 134 for (let i = 0; dart.notNull(i) < dart.notNull(keys[dartx.length]); i = da
rt.notNull(i) + 1) { | |
| 135 values[dartx.set](i, this.serialize(x[keys[dartx.get](i)])); | |
| 136 } | |
| 137 return ['js-object', keys, values]; | |
| 138 } | |
| 139 serializeWorkerSendPort(x) { | |
| 140 if (dart.notNull(this[_serializeSendPorts])) { | |
| 141 return ['sendport', x[_workerId], x[_isolateId], x[_receivePortId]]; | |
| 142 } | |
| 143 return ['raw sendport', x]; | |
| 144 } | |
| 145 serializeJsSendPort(x) { | |
| 146 if (dart.notNull(this[_serializeSendPorts])) { | |
| 147 let workerId = exports._globalState.currentManagerId; | |
| 148 return ['sendport', workerId, x[_isolateId], x[_receivePort][_id]]; | |
| 149 } | |
| 150 return ['raw sendport', x]; | |
| 151 } | |
| 152 serializeCapability(x) { | |
| 153 return ['capability', x[_id]]; | |
| 154 } | |
| 155 serializeClosure(x) { | |
| 156 let name = IsolateNatives._getJSFunctionName(x); | |
| 157 if (name == null) { | |
| 158 this.unsupported(x, "Closures can't be transmitted:"); | |
| 159 } | |
| 160 return ['function', name]; | |
| 161 } | |
| 162 serializeDartObject(x) { | |
| 163 let classExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_n
ames.CLASS_ID_EXTRACTOR); | |
| 164 let fieldsExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_
names.CLASS_FIELDS_EXTRACTOR); | |
| 165 let classId = classExtractor(x); | |
| 166 let fields = dart.as(fieldsExtractor(x), core.List); | |
| 167 return ['dart', classId, this.serializeArrayInPlace(dart.as(fields, _inter
ceptors.JSArray))]; | |
| 168 } | |
| 169 } | |
| 170 dart.setSignature(_Serializer, { | |
| 171 constructors: () => ({_Serializer: [_Serializer, [], {serializeSendPorts: da
rt.dynamic}]}), | |
| 172 methods: () => ({ | |
| 173 serialize: [dart.dynamic, [dart.dynamic]], | |
| 174 unsupported: [dart.void, [dart.dynamic], [core.String]], | |
| 175 makeRef: [dart.dynamic, [core.int]], | |
| 176 isPrimitive: [core.bool, [dart.dynamic]], | |
| 177 serializePrimitive: [dart.dynamic, [dart.dynamic]], | |
| 178 serializeByteBuffer: [dart.dynamic, [_native_typed_data.NativeByteBuffer]]
, | |
| 179 serializeTypedData: [dart.dynamic, [_native_typed_data.NativeTypedData]], | |
| 180 serializeJSIndexable: [dart.dynamic, [_interceptors.JSIndexable]], | |
| 181 serializeArray: [dart.dynamic, [_interceptors.JSArray]], | |
| 182 serializeArrayInPlace: [dart.dynamic, [_interceptors.JSArray]], | |
| 183 serializeMap: [dart.dynamic, [core.Map]], | |
| 184 serializeJSObject: [dart.dynamic, [_interceptors.JSObject]], | |
| 185 serializeWorkerSendPort: [dart.dynamic, [_WorkerSendPort]], | |
| 186 serializeJsSendPort: [dart.dynamic, [_NativeJsSendPort]], | |
| 187 serializeCapability: [dart.dynamic, [CapabilityImpl]], | |
| 188 serializeClosure: [dart.dynamic, [core.Function]], | |
| 189 serializeDartObject: [dart.dynamic, [dart.dynamic]] | |
| 190 }) | |
| 191 }); | |
| 192 let _adjustSendPorts = Symbol('_adjustSendPorts'); | |
| 193 class _Deserializer extends core.Object { | |
| 194 _Deserializer(opts) { | |
| 195 let adjustSendPorts = opts && 'adjustSendPorts' in opts ? opts.adjustSendP
orts : true; | |
| 196 this.deserializedObjects = core.List.new(); | |
| 197 this[_adjustSendPorts] = dart.as(adjustSendPorts, core.bool); | |
| 198 } | |
| 199 deserialize(x) { | |
| 200 if (dart.notNull(this.isPrimitive(x))) | |
| 201 return this.deserializePrimitive(x); | |
| 202 if (!dart.is(x, _interceptors.JSArray)) | |
| 203 dart.throw(new core.ArgumentError(`Bad serialized message: ${x}`)); | |
| 204 switch (dart.dload(x, 'first')) { | |
| 205 case "ref": | |
| 206 { | |
| 207 return this.deserializeRef(x); | |
| 208 } | |
| 209 case "buffer": | |
| 210 { | |
| 211 return this.deserializeByteBuffer(x); | |
| 212 } | |
| 213 case "typed": | |
| 214 { | |
| 215 return this.deserializeTypedData(x); | |
| 216 } | |
| 217 case "fixed": | |
| 218 { | |
| 219 return this.deserializeFixed(x); | |
| 220 } | |
| 221 case "extendable": | |
| 222 { | |
| 223 return this.deserializeExtendable(x); | |
| 224 } | |
| 225 case "mutable": | |
| 226 { | |
| 227 return this.deserializeMutable(x); | |
| 228 } | |
| 229 case "const": | |
| 230 { | |
| 231 return this.deserializeConst(x); | |
| 232 } | |
| 233 case "map": | |
| 234 { | |
| 235 return this.deserializeMap(x); | |
| 236 } | |
| 237 case "sendport": | |
| 238 { | |
| 239 return this.deserializeSendPort(x); | |
| 240 } | |
| 241 case "raw sendport": | |
| 242 { | |
| 243 return this.deserializeRawSendPort(x); | |
| 244 } | |
| 245 case "js-object": | |
| 246 { | |
| 247 return this.deserializeJSObject(x); | |
| 248 } | |
| 249 case "function": | |
| 250 { | |
| 251 return this.deserializeClosure(x); | |
| 252 } | |
| 253 case "dart": | |
| 254 { | |
| 255 return this.deserializeDartObject(x); | |
| 256 } | |
| 257 default: | |
| 258 { | |
| 259 dart.throw(`couldn't deserialize: ${x}`); | |
| 260 } | |
| 261 } | |
| 262 } | |
| 263 isPrimitive(x) { | |
| 264 return x == null || typeof x == 'string' || dart.is(x, core.num) || typeof
x == 'boolean'; | |
| 265 } | |
| 266 deserializePrimitive(x) { | |
| 267 return x; | |
| 268 } | |
| 269 deserializeRef(x) { | |
| 270 dart.assert(dart.equals(dart.dindex(x, 0), 'ref')); | |
| 271 let serializationId = dart.as(dart.dindex(x, 1), core.int); | |
| 272 return this.deserializedObjects[dartx.get](serializationId); | |
| 273 } | |
| 274 deserializeByteBuffer(x) { | |
| 275 dart.assert(dart.equals(dart.dindex(x, 0), 'buffer')); | |
| 276 let result = dart.as(dart.dindex(x, 1), _native_typed_data.NativeByteBuffe
r); | |
| 277 this.deserializedObjects[dartx.add](result); | |
| 278 return result; | |
| 279 } | |
| 280 deserializeTypedData(x) { | |
| 281 dart.assert(dart.equals(dart.dindex(x, 0), 'typed')); | |
| 282 let result = dart.as(dart.dindex(x, 1), _native_typed_data.NativeTypedData
); | |
| 283 this.deserializedObjects[dartx.add](result); | |
| 284 return result; | |
| 285 } | |
| 286 deserializeArrayInPlace(x) { | |
| 287 for (let i = 0; dart.notNull(i) < dart.notNull(x[dartx.length]); i = dart.
notNull(i) + 1) { | |
| 288 x[dartx.set](i, this.deserialize(x[dartx.get](i))); | |
| 289 } | |
| 290 return x; | |
| 291 } | |
| 292 deserializeFixed(x) { | |
| 293 dart.assert(dart.equals(dart.dindex(x, 0), 'fixed')); | |
| 294 let result = dart.as(dart.dindex(x, 1), core.List); | |
| 295 this.deserializedObjects[dartx.add](result); | |
| 296 return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(dart.a
s(result, _interceptors.JSArray))); | |
| 297 } | |
| 298 deserializeExtendable(x) { | |
| 299 dart.assert(dart.equals(dart.dindex(x, 0), 'extendable')); | |
| 300 let result = dart.as(dart.dindex(x, 1), core.List); | |
| 301 this.deserializedObjects[dartx.add](result); | |
| 302 return _interceptors.JSArray.markGrowable(this.deserializeArrayInPlace(dar
t.as(result, _interceptors.JSArray))); | |
| 303 } | |
| 304 deserializeMutable(x) { | |
| 305 dart.assert(dart.equals(dart.dindex(x, 0), 'mutable')); | |
| 306 let result = dart.as(dart.dindex(x, 1), core.List); | |
| 307 this.deserializedObjects[dartx.add](result); | |
| 308 return this.deserializeArrayInPlace(dart.as(result, _interceptors.JSArray)
); | |
| 309 } | |
| 310 deserializeConst(x) { | |
| 311 dart.assert(dart.equals(dart.dindex(x, 0), 'const')); | |
| 312 let result = dart.as(dart.dindex(x, 1), core.List); | |
| 313 this.deserializedObjects[dartx.add](result); | |
| 314 return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(dart.a
s(result, _interceptors.JSArray))); | |
| 315 } | |
| 316 deserializeMap(x) { | |
| 317 dart.assert(dart.equals(dart.dindex(x, 0), 'map')); | |
| 318 let keys = dart.as(dart.dindex(x, 1), core.List); | |
| 319 let values = dart.as(dart.dindex(x, 2), core.List); | |
| 320 let result = dart.map(); | |
| 321 this.deserializedObjects[dartx.add](result); | |
| 322 keys = keys[dartx.map](dart.bind(this, 'deserialize'))[dartx.toList](); | |
| 323 for (let i = 0; dart.notNull(i) < dart.notNull(keys[dartx.length]); i = da
rt.notNull(i) + 1) { | |
| 324 result.set(keys[dartx.get](i), this.deserialize(values[dartx.get](i))); | |
| 325 } | |
| 326 return result; | |
| 327 } | |
| 328 deserializeSendPort(x) { | |
| 329 dart.assert(dart.equals(dart.dindex(x, 0), 'sendport')); | |
| 330 let managerId = dart.as(dart.dindex(x, 1), core.int); | |
| 331 let isolateId = dart.as(dart.dindex(x, 2), core.int); | |
| 332 let receivePortId = dart.as(dart.dindex(x, 3), core.int); | |
| 333 let result = null; | |
| 334 if (managerId == exports._globalState.currentManagerId) { | |
| 335 let isolate = exports._globalState.isolates.get(isolateId); | |
| 336 if (isolate == null) | |
| 337 return null; | |
| 338 let receivePort = isolate.lookup(receivePortId); | |
| 339 if (receivePort == null) | |
| 340 return null; | |
| 341 result = new _NativeJsSendPort(receivePort, isolateId); | |
| 342 } else { | |
| 343 result = new _WorkerSendPort(managerId, isolateId, receivePortId); | |
| 344 } | |
| 345 this.deserializedObjects[dartx.add](result); | |
| 346 return result; | |
| 347 } | |
| 348 deserializeRawSendPort(x) { | |
| 349 dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport')); | |
| 350 let result = dart.as(dart.dindex(x, 1), isolate.SendPort); | |
| 351 this.deserializedObjects[dartx.add](result); | |
| 352 return result; | |
| 353 } | |
| 354 deserializeJSObject(x) { | |
| 355 dart.assert(dart.equals(dart.dindex(x, 0), 'js-object')); | |
| 356 let keys = dart.as(dart.dindex(x, 1), core.List); | |
| 357 let values = dart.as(dart.dindex(x, 2), core.List); | |
| 358 let o = {}; | |
| 359 this.deserializedObjects[dartx.add](o); | |
| 360 for (let i = 0; dart.notNull(i) < dart.notNull(keys[dartx.length]); i = da
rt.notNull(i) + 1) { | |
| 361 o[keys[dartx.get](i)] = this.deserialize(values[dartx.get](i)); | |
| 362 } | |
| 363 return o; | |
| 364 } | |
| 365 deserializeClosure(x) { | |
| 366 dart.assert(dart.equals(dart.dindex(x, 0), 'function')); | |
| 367 let name = dart.as(dart.dindex(x, 1), core.String); | |
| 368 let result = dart.as(IsolateNatives._getJSFunctionFromName(name), core.Fun
ction); | |
| 369 this.deserializedObjects[dartx.add](result); | |
| 370 return result; | |
| 371 } | |
| 372 deserializeDartObject(x) { | |
| 373 dart.assert(dart.equals(dart.dindex(x, 0), 'dart')); | |
| 374 let classId = dart.as(dart.dindex(x, 1), core.String); | |
| 375 let fields = dart.as(dart.dindex(x, 2), core.List); | |
| 376 let instanceFromClassId = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embed
ded_names.INSTANCE_FROM_CLASS_ID); | |
| 377 let initializeObject = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded
_names.INITIALIZE_EMPTY_INSTANCE); | |
| 378 let emptyInstance = instanceFromClassId(classId); | |
| 379 this.deserializedObjects[dartx.add](emptyInstance); | |
| 380 this.deserializeArrayInPlace(dart.as(fields, _interceptors.JSArray)); | |
| 381 return initializeObject(classId, emptyInstance, fields); | |
| 382 } | |
| 383 } | |
| 384 dart.setSignature(_Deserializer, { | |
| 385 constructors: () => ({_Deserializer: [_Deserializer, [], {adjustSendPorts: d
art.dynamic}]}), | |
| 386 methods: () => ({ | |
| 387 deserialize: [dart.dynamic, [dart.dynamic]], | |
| 388 isPrimitive: [core.bool, [dart.dynamic]], | |
| 389 deserializePrimitive: [dart.dynamic, [dart.dynamic]], | |
| 390 deserializeRef: [dart.dynamic, [dart.dynamic]], | |
| 391 deserializeByteBuffer: [_native_typed_data.NativeByteBuffer, [dart.dynamic
]], | |
| 392 deserializeTypedData: [_native_typed_data.NativeTypedData, [dart.dynamic]]
, | |
| 393 deserializeArrayInPlace: [core.List, [_interceptors.JSArray]], | |
| 394 deserializeFixed: [core.List, [dart.dynamic]], | |
| 395 deserializeExtendable: [core.List, [dart.dynamic]], | |
| 396 deserializeMutable: [core.List, [dart.dynamic]], | |
| 397 deserializeConst: [core.List, [dart.dynamic]], | |
| 398 deserializeMap: [core.Map, [dart.dynamic]], | |
| 399 deserializeSendPort: [isolate.SendPort, [dart.dynamic]], | |
| 400 deserializeRawSendPort: [isolate.SendPort, [dart.dynamic]], | |
| 401 deserializeJSObject: [dart.dynamic, [dart.dynamic]], | |
| 402 deserializeClosure: [core.Function, [dart.dynamic]], | |
| 403 deserializeDartObject: [dart.dynamic, [dart.dynamic]] | |
| 404 }) | |
| 405 }); | |
| 406 let __CastType0 = dart.typedef('__CastType0', () => dart.functionType(dart.dyn
amic, [dart.dynamic])); | |
| 407 function _callInIsolate(isolate, func) { | |
| 408 let result = isolate.eval(func); | |
| 409 exports._globalState.topEventLoop.run(); | |
| 410 return result; | |
| 411 } | |
| 412 dart.fn(_callInIsolate, () => dart.definiteFunctionType(dart.dynamic, [_Isolat
eContext, core.Function])); | |
| 413 let _activeJsAsyncCount = Symbol('_activeJsAsyncCount'); | |
| 414 function enterJsAsync() { | |
| 415 let o = exports._globalState.topEventLoop; | |
| 416 o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) + 1; | |
| 417 } | |
| 418 dart.fn(enterJsAsync); | |
| 419 function leaveJsAsync() { | |
| 420 let o = exports._globalState.topEventLoop; | |
| 421 o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) - 1; | |
| 422 dart.assert(dart.notNull(exports._globalState.topEventLoop[_activeJsAsyncCou
nt]) >= 0); | |
| 423 } | |
| 424 dart.fn(leaveJsAsync); | |
| 425 function isWorker() { | |
| 426 return exports._globalState.isWorker; | |
| 427 } | |
| 428 dart.fn(isWorker, core.bool, []); | |
| 429 function _currentIsolate() { | |
| 430 return exports._globalState.currentContext; | |
| 431 } | |
| 432 dart.fn(_currentIsolate, () => dart.definiteFunctionType(_IsolateContext, []))
; | |
| 433 function startRootIsolate(entry, args) { | |
| 434 args = args; | |
| 435 if (args == null) | |
| 436 args = []; | |
| 437 if (!dart.is(args, core.List)) { | |
| 438 dart.throw(new core.ArgumentError(`Arguments to main must be a List: ${arg
s}`)); | |
| 439 } | |
| 440 exports._globalState = new _Manager(dart.as(entry, core.Function)); | |
| 441 if (dart.notNull(exports._globalState.isWorker)) | |
| 442 return; | |
| 443 let rootContext = new _IsolateContext(); | |
| 444 exports._globalState.rootContext = rootContext; | |
| 445 exports._globalState.currentContext = rootContext; | |
| 446 if (dart.is(entry, _MainFunctionArgs)) { | |
| 447 rootContext.eval(dart.fn(() => { | |
| 448 dart.dcall(entry, args); | |
| 449 })); | |
| 450 } else if (dart.is(entry, _MainFunctionArgsMessage)) { | |
| 451 rootContext.eval(dart.fn(() => { | |
| 452 dart.dcall(entry, args, null); | |
| 453 })); | |
| 454 } else { | |
| 455 rootContext.eval(dart.as(entry, core.Function)); | |
| 456 } | |
| 457 exports._globalState.topEventLoop.run(); | |
| 458 } | |
| 459 dart.fn(startRootIsolate, dart.void, [dart.dynamic, dart.dynamic]); | |
| 460 dart.copyProperties(exports, { | |
| 461 get _globalState() { | |
| 462 return dart.as(dart.globalState, _Manager); | |
| 463 }, | |
| 464 set _globalState(val) { | |
| 465 dart.globalState = val; | |
| 466 } | |
| 467 }); | |
| 468 let _nativeDetectEnvironment = Symbol('_nativeDetectEnvironment'); | |
| 469 let _nativeInitWorkerMessageHandler = Symbol('_nativeInitWorkerMessageHandler'
); | |
| 470 class _Manager extends core.Object { | |
| 471 get useWorkers() { | |
| 472 return this.supportsWorkers; | |
| 473 } | |
| 474 _Manager(entry) { | |
| 475 this.entry = entry; | |
| 476 this.nextIsolateId = 0; | |
| 477 this.currentManagerId = 0; | |
| 478 this.nextManagerId = 1; | |
| 479 this.currentContext = null; | |
| 480 this.rootContext = null; | |
| 481 this.topEventLoop = null; | |
| 482 this.fromCommandLine = null; | |
| 483 this.isWorker = null; | |
| 484 this.supportsWorkers = null; | |
| 485 this.isolates = null; | |
| 486 this.mainManager = null; | |
| 487 this.managers = null; | |
| 488 this[_nativeDetectEnvironment](); | |
| 489 this.topEventLoop = new _EventLoop(); | |
| 490 this.isolates = core.Map$(core.int, _IsolateContext).new(); | |
| 491 this.managers = core.Map$(core.int, dart.dynamic).new(); | |
| 492 if (dart.notNull(this.isWorker)) { | |
| 493 this.mainManager = new _MainManagerStub(); | |
| 494 this[_nativeInitWorkerMessageHandler](); | |
| 495 } | |
| 496 } | |
| 497 [_nativeDetectEnvironment]() { | |
| 498 let isWindowDefined = exports.globalWindow != null; | |
| 499 let isWorkerDefined = exports.globalWorker != null; | |
| 500 this.isWorker = !dart.notNull(isWindowDefined) && dart.notNull(exports.glo
balPostMessageDefined); | |
| 501 this.supportsWorkers = dart.notNull(this.isWorker) || dart.notNull(isWorke
rDefined) && IsolateNatives.thisScript != null; | |
| 502 this.fromCommandLine = !dart.notNull(isWindowDefined) && !dart.notNull(thi
s.isWorker); | |
| 503 } | |
| 504 [_nativeInitWorkerMessageHandler]() { | |
| 505 let func = (function(f, a) { | |
| 506 return function(e) { | |
| 507 f(a, e); | |
| 508 }; | |
| 509 })(IsolateNatives._processWorkerMessage, this.mainManager); | |
| 510 self.onmessage = func; | |
| 511 self.dartPrint = self.dartPrint || (function(serialize) { | |
| 512 return function(object) { | |
| 513 if (self.console && self.console.log) { | |
| 514 self.console.log(object); | |
| 515 } else { | |
| 516 self.postMessage(serialize(object)); | |
| 517 } | |
| 518 }; | |
| 519 })(_Manager._serializePrintMessage); | |
| 520 } | |
| 521 static _serializePrintMessage(object) { | |
| 522 return _serializeMessage(dart.map({command: "print", msg: object})); | |
| 523 } | |
| 524 maybeCloseWorker() { | |
| 525 if (dart.notNull(this.isWorker) && dart.notNull(this.isolates.isEmpty) &&
this.topEventLoop[_activeJsAsyncCount] == 0) { | |
| 526 this.mainManager.postMessage(_serializeMessage(dart.map({command: 'close
'}))); | |
| 527 } | |
| 528 } | |
| 529 } | |
| 530 dart.setSignature(_Manager, { | |
| 531 constructors: () => ({_Manager: [_Manager, [core.Function]]}), | |
| 532 methods: () => ({ | |
| 533 [_nativeDetectEnvironment]: [dart.void, []], | |
| 534 [_nativeInitWorkerMessageHandler]: [dart.void, []], | |
| 535 maybeCloseWorker: [dart.void, []] | |
| 536 }), | |
| 537 statics: () => ({_serializePrintMessage: [dart.dynamic, [dart.dynamic]]}), | |
| 538 names: ['_serializePrintMessage'] | |
| 539 }); | |
| 540 let _scheduledControlEvents = Symbol('_scheduledControlEvents'); | |
| 541 let _isExecutingEvent = Symbol('_isExecutingEvent'); | |
| 542 let _updateGlobalState = Symbol('_updateGlobalState'); | |
| 543 let _setGlobals = Symbol('_setGlobals'); | |
| 544 let _addRegistration = Symbol('_addRegistration'); | |
| 545 let _close = Symbol('_close'); | |
| 546 class _IsolateContext extends core.Object { | |
| 547 _IsolateContext() { | |
| 548 this.id = (() => { | |
| 549 let o = exports._globalState, x = o.nextIsolateId; | |
| 550 o.nextIsolateId = dart.notNull(x) + 1; | |
| 551 return x; | |
| 552 })(); | |
| 553 this.ports = core.Map$(core.int, RawReceivePortImpl).new(); | |
| 554 this.weakPorts = core.Set$(core.int).new(); | |
| 555 this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE(); | |
| 556 this.controlPort = new RawReceivePortImpl._controlPort(); | |
| 557 this.pauseCapability = isolate.Capability.new(); | |
| 558 this.terminateCapability = isolate.Capability.new(); | |
| 559 this.delayedEvents = dart.list([], _IsolateEvent); | |
| 560 this.pauseTokens = core.Set$(isolate.Capability).new(); | |
| 561 this.errorPorts = core.Set$(isolate.SendPort).new(); | |
| 562 this.initialized = false; | |
| 563 this.isPaused = false; | |
| 564 this.doneHandlers = null; | |
| 565 this[_scheduledControlEvents] = null; | |
| 566 this[_isExecutingEvent] = false; | |
| 567 this.errorsAreFatal = true; | |
| 568 this.registerWeak(this.controlPort[_id], this.controlPort); | |
| 569 } | |
| 570 addPause(authentification, resume) { | |
| 571 if (!dart.equals(this.pauseCapability, authentification)) | |
| 572 return; | |
| 573 if (dart.notNull(this.pauseTokens.add(resume)) && !dart.notNull(this.isPau
sed)) { | |
| 574 this.isPaused = true; | |
| 575 } | |
| 576 this[_updateGlobalState](); | |
| 577 } | |
| 578 removePause(resume) { | |
| 579 if (!dart.notNull(this.isPaused)) | |
| 580 return; | |
| 581 this.pauseTokens.remove(resume); | |
| 582 if (dart.notNull(this.pauseTokens.isEmpty)) { | |
| 583 while (dart.notNull(this.delayedEvents[dartx.isNotEmpty])) { | |
| 584 let event = this.delayedEvents[dartx.removeLast](); | |
| 585 exports._globalState.topEventLoop.prequeue(event); | |
| 586 } | |
| 587 this.isPaused = false; | |
| 588 } | |
| 589 this[_updateGlobalState](); | |
| 590 } | |
| 591 addDoneListener(responsePort) { | |
| 592 if (this.doneHandlers == null) { | |
| 593 this.doneHandlers = []; | |
| 594 } | |
| 595 if (dart.notNull(dart.as(dart.dsend(this.doneHandlers, 'contains', respons
ePort), core.bool))) | |
| 596 return; | |
| 597 dart.dsend(this.doneHandlers, 'add', responsePort); | |
| 598 } | |
| 599 removeDoneListener(responsePort) { | |
| 600 if (this.doneHandlers == null) | |
| 601 return; | |
| 602 dart.dsend(this.doneHandlers, 'remove', responsePort); | |
| 603 } | |
| 604 setErrorsFatal(authentification, errorsAreFatal) { | |
| 605 if (!dart.equals(this.terminateCapability, authentification)) | |
| 606 return; | |
| 607 this.errorsAreFatal = errorsAreFatal; | |
| 608 } | |
| 609 handlePing(responsePort, pingType) { | |
| 610 if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.B
EFORE_NEXT_EVENT && !dart.notNull(this[_isExecutingEvent])) { | |
| 611 responsePort.send(null); | |
| 612 return; | |
| 613 } | |
| 614 function respond() { | |
| 615 responsePort.send(null); | |
| 616 } | |
| 617 dart.fn(respond, dart.void, []); | |
| 618 if (pingType == isolate.Isolate.AS_EVENT) { | |
| 619 exports._globalState.topEventLoop.enqueue(this, respond, "ping"); | |
| 620 return; | |
| 621 } | |
| 622 dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT); | |
| 623 if (this[_scheduledControlEvents] == null) { | |
| 624 this[_scheduledControlEvents] = collection.Queue.new(); | |
| 625 } | |
| 626 dart.dsend(this[_scheduledControlEvents], 'addLast', respond); | |
| 627 } | |
| 628 handleKill(authentification, priority) { | |
| 629 if (!dart.equals(this.terminateCapability, authentification)) | |
| 630 return; | |
| 631 if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.B
EFORE_NEXT_EVENT && !dart.notNull(this[_isExecutingEvent])) { | |
| 632 this.kill(); | |
| 633 return; | |
| 634 } | |
| 635 if (priority == isolate.Isolate.AS_EVENT) { | |
| 636 exports._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'),
"kill"); | |
| 637 return; | |
| 638 } | |
| 639 dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT); | |
| 640 if (this[_scheduledControlEvents] == null) { | |
| 641 this[_scheduledControlEvents] = collection.Queue.new(); | |
| 642 } | |
| 643 dart.dsend(this[_scheduledControlEvents], 'addLast', dart.bind(this, 'kill
')); | |
| 644 } | |
| 645 addErrorListener(port) { | |
| 646 this.errorPorts.add(port); | |
| 647 } | |
| 648 removeErrorListener(port) { | |
| 649 this.errorPorts.remove(port); | |
| 650 } | |
| 651 handleUncaughtError(error, stackTrace) { | |
| 652 if (dart.notNull(this.errorPorts.isEmpty)) { | |
| 653 if (dart.notNull(this.errorsAreFatal) && dart.notNull(core.identical(thi
s, exports._globalState.rootContext))) { | |
| 654 return; | |
| 655 } | |
| 656 if (self.console && self.console.error) { | |
| 657 self.console.error(error, stackTrace); | |
| 658 } else { | |
| 659 core.print(error); | |
| 660 if (stackTrace != null) | |
| 661 core.print(stackTrace); | |
| 662 } | |
| 663 return; | |
| 664 } | |
| 665 let message = core.List.new(2); | |
| 666 message[dartx.set](0, dart.toString(error)); | |
| 667 message[dartx.set](1, stackTrace == null ? null : dart.toString(stackTrace
)); | |
| 668 for (let port of this.errorPorts) | |
| 669 port.send(message); | |
| 670 } | |
| 671 eval(code) { | |
| 672 let old = exports._globalState.currentContext; | |
| 673 exports._globalState.currentContext = this; | |
| 674 this[_setGlobals](); | |
| 675 let result = null; | |
| 676 this[_isExecutingEvent] = true; | |
| 677 try { | |
| 678 result = dart.dcall(code); | |
| 679 } catch (e) { | |
| 680 let s = dart.stackTrace(e); | |
| 681 this.handleUncaughtError(e, s); | |
| 682 if (dart.notNull(this.errorsAreFatal)) { | |
| 683 this.kill(); | |
| 684 if (dart.notNull(core.identical(this, exports._globalState.rootContext
))) { | |
| 685 throw e; | |
| 686 } | |
| 687 } | |
| 688 } | |
| 689 finally { | |
| 690 this[_isExecutingEvent] = false; | |
| 691 exports._globalState.currentContext = old; | |
| 692 if (old != null) | |
| 693 old[_setGlobals](); | |
| 694 if (this[_scheduledControlEvents] != null) { | |
| 695 while (dart.notNull(dart.as(dart.dload(this[_scheduledControlEvents],
'isNotEmpty'), core.bool))) { | |
| 696 dart.dcall(dart.dsend(this[_scheduledControlEvents], 'removeFirst'))
; | |
| 697 } | |
| 698 } | |
| 699 } | |
| 700 return result; | |
| 701 } | |
| 702 [_setGlobals]() { | |
| 703 _foreign_helper.JS_SET_CURRENT_ISOLATE(this.isolateStatics); | |
| 704 } | |
| 705 handleControlMessage(message) { | |
| 706 switch (dart.dindex(message, 0)) { | |
| 707 case "pause": | |
| 708 { | |
| 709 this.addPause(dart.as(dart.dindex(message, 1), isolate.Capability), da
rt.as(dart.dindex(message, 2), isolate.Capability)); | |
| 710 break; | |
| 711 } | |
| 712 case "resume": | |
| 713 { | |
| 714 this.removePause(dart.as(dart.dindex(message, 1), isolate.Capability))
; | |
| 715 break; | |
| 716 } | |
| 717 case 'add-ondone': | |
| 718 { | |
| 719 this.addDoneListener(dart.as(dart.dindex(message, 1), isolate.SendPort
)); | |
| 720 break; | |
| 721 } | |
| 722 case 'remove-ondone': | |
| 723 { | |
| 724 this.removeDoneListener(dart.as(dart.dindex(message, 1), isolate.SendP
ort)); | |
| 725 break; | |
| 726 } | |
| 727 case 'set-errors-fatal': | |
| 728 { | |
| 729 this.setErrorsFatal(dart.as(dart.dindex(message, 1), isolate.Capabilit
y), dart.as(dart.dindex(message, 2), core.bool)); | |
| 730 break; | |
| 731 } | |
| 732 case "ping": | |
| 733 { | |
| 734 this.handlePing(dart.as(dart.dindex(message, 1), isolate.SendPort), da
rt.as(dart.dindex(message, 2), core.int)); | |
| 735 break; | |
| 736 } | |
| 737 case "kill": | |
| 738 { | |
| 739 this.handleKill(dart.as(dart.dindex(message, 1), isolate.Capability),
dart.as(dart.dindex(message, 2), core.int)); | |
| 740 break; | |
| 741 } | |
| 742 case "getErrors": | |
| 743 { | |
| 744 this.addErrorListener(dart.as(dart.dindex(message, 1), isolate.SendPor
t)); | |
| 745 break; | |
| 746 } | |
| 747 case "stopErrors": | |
| 748 { | |
| 749 this.removeErrorListener(dart.as(dart.dindex(message, 1), isolate.Send
Port)); | |
| 750 break; | |
| 751 } | |
| 752 default: | |
| 753 } | |
| 754 } | |
| 755 lookup(portId) { | |
| 756 return this.ports.get(portId); | |
| 757 } | |
| 758 [_addRegistration](portId, port) { | |
| 759 if (dart.notNull(this.ports.containsKey(portId))) { | |
| 760 dart.throw(core.Exception.new("Registry: ports must be registered only o
nce.")); | |
| 761 } | |
| 762 this.ports.set(portId, port); | |
| 763 } | |
| 764 register(portId, port) { | |
| 765 this[_addRegistration](portId, port); | |
| 766 this[_updateGlobalState](); | |
| 767 } | |
| 768 registerWeak(portId, port) { | |
| 769 this.weakPorts.add(portId); | |
| 770 this[_addRegistration](portId, port); | |
| 771 } | |
| 772 [_updateGlobalState]() { | |
| 773 if (dart.notNull(this.ports.length) - dart.notNull(this.weakPorts.length)
> 0 || dart.notNull(this.isPaused) || !dart.notNull(this.initialized)) { | |
| 774 exports._globalState.isolates.set(this.id, this); | |
| 775 } else { | |
| 776 this.kill(); | |
| 777 } | |
| 778 } | |
| 779 kill() { | |
| 780 if (this[_scheduledControlEvents] != null) { | |
| 781 dart.dsend(this[_scheduledControlEvents], 'clear'); | |
| 782 } | |
| 783 for (let port of this.ports.values) { | |
| 784 port[_close](); | |
| 785 } | |
| 786 this.ports.clear(); | |
| 787 this.weakPorts.clear(); | |
| 788 exports._globalState.isolates.remove(this.id); | |
| 789 this.errorPorts.clear(); | |
| 790 if (this.doneHandlers != null) { | |
| 791 for (let port of dart.as(this.doneHandlers, core.Iterable$(isolate.SendP
ort))) { | |
| 792 port.send(null); | |
| 793 } | |
| 794 this.doneHandlers = null; | |
| 795 } | |
| 796 } | |
| 797 unregister(portId) { | |
| 798 this.ports.remove(portId); | |
| 799 this.weakPorts.remove(portId); | |
| 800 this[_updateGlobalState](); | |
| 801 } | |
| 802 } | |
| 803 _IsolateContext[dart.implements] = () => [_foreign_helper.IsolateContext]; | |
| 804 dart.setSignature(_IsolateContext, { | |
| 805 constructors: () => ({_IsolateContext: [_IsolateContext, []]}), | |
| 806 methods: () => ({ | |
| 807 addPause: [dart.void, [isolate.Capability, isolate.Capability]], | |
| 808 removePause: [dart.void, [isolate.Capability]], | |
| 809 addDoneListener: [dart.void, [isolate.SendPort]], | |
| 810 removeDoneListener: [dart.void, [isolate.SendPort]], | |
| 811 setErrorsFatal: [dart.void, [isolate.Capability, core.bool]], | |
| 812 handlePing: [dart.void, [isolate.SendPort, core.int]], | |
| 813 handleKill: [dart.void, [isolate.Capability, core.int]], | |
| 814 addErrorListener: [dart.void, [isolate.SendPort]], | |
| 815 removeErrorListener: [dart.void, [isolate.SendPort]], | |
| 816 handleUncaughtError: [dart.void, [dart.dynamic, core.StackTrace]], | |
| 817 eval: [dart.dynamic, [core.Function]], | |
| 818 [_setGlobals]: [dart.void, []], | |
| 819 handleControlMessage: [dart.void, [dart.dynamic]], | |
| 820 lookup: [RawReceivePortImpl, [core.int]], | |
| 821 [_addRegistration]: [dart.void, [core.int, RawReceivePortImpl]], | |
| 822 register: [dart.void, [core.int, RawReceivePortImpl]], | |
| 823 registerWeak: [dart.void, [core.int, RawReceivePortImpl]], | |
| 824 [_updateGlobalState]: [dart.void, []], | |
| 825 kill: [dart.void, []], | |
| 826 unregister: [dart.void, [core.int]] | |
| 827 }) | |
| 828 }); | |
| 829 let _runHelper = Symbol('_runHelper'); | |
| 830 class _EventLoop extends core.Object { | |
| 831 _EventLoop() { | |
| 832 this.events = collection.Queue$(_IsolateEvent).new(); | |
| 833 this[_activeJsAsyncCount] = 0; | |
| 834 } | |
| 835 enqueue(isolate, fn, msg) { | |
| 836 this.events.addLast(new _IsolateEvent(dart.as(isolate, _IsolateContext), d
art.as(fn, core.Function), dart.as(msg, core.String))); | |
| 837 } | |
| 838 prequeue(event) { | |
| 839 this.events.addFirst(event); | |
| 840 } | |
| 841 dequeue() { | |
| 842 if (dart.notNull(this.events.isEmpty)) | |
| 843 return null; | |
| 844 return this.events.removeFirst(); | |
| 845 } | |
| 846 checkOpenReceivePortsFromCommandLine() { | |
| 847 if (exports._globalState.rootContext != null && dart.notNull(exports._glob
alState.isolates.containsKey(exports._globalState.rootContext.id)) && dart.notNu
ll(exports._globalState.fromCommandLine) && dart.notNull(exports._globalState.ro
otContext.ports.isEmpty)) { | |
| 848 dart.throw(core.Exception.new("Program exited with open ReceivePorts."))
; | |
| 849 } | |
| 850 } | |
| 851 runIteration() { | |
| 852 let event = this.dequeue(); | |
| 853 if (event == null) { | |
| 854 this.checkOpenReceivePortsFromCommandLine(); | |
| 855 exports._globalState.maybeCloseWorker(); | |
| 856 return false; | |
| 857 } | |
| 858 event.process(); | |
| 859 return true; | |
| 860 } | |
| 861 [_runHelper]() { | |
| 862 if (exports.globalWindow != null) { | |
| 863 let next = (function() { | |
| 864 if (!dart.notNull(this.runIteration())) | |
| 865 return; | |
| 866 async.Timer.run(next); | |
| 867 }).bind(this); | |
| 868 dart.fn(next); | |
| 869 next(); | |
| 870 } else { | |
| 871 while (dart.notNull(this.runIteration())) { | |
| 872 } | |
| 873 } | |
| 874 } | |
| 875 run() { | |
| 876 if (!dart.notNull(exports._globalState.isWorker)) { | |
| 877 this[_runHelper](); | |
| 878 } else { | |
| 879 try { | |
| 880 this[_runHelper](); | |
| 881 } catch (e) { | |
| 882 let trace = dart.stackTrace(e); | |
| 883 exports._globalState.mainManager.postMessage(_serializeMessage(dart.ma
p({command: 'error', msg: `${e}\n${trace}`}))); | |
| 884 } | |
| 885 | |
| 886 } | |
| 887 } | |
| 888 } | |
| 889 dart.setSignature(_EventLoop, { | |
| 890 constructors: () => ({_EventLoop: [_EventLoop, []]}), | |
| 891 methods: () => ({ | |
| 892 enqueue: [dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]], | |
| 893 prequeue: [dart.void, [_IsolateEvent]], | |
| 894 dequeue: [_IsolateEvent, []], | |
| 895 checkOpenReceivePortsFromCommandLine: [dart.void, []], | |
| 896 runIteration: [core.bool, []], | |
| 897 [_runHelper]: [dart.void, []], | |
| 898 run: [dart.void, []] | |
| 899 }) | |
| 900 }); | |
| 901 class _IsolateEvent extends core.Object { | |
| 902 _IsolateEvent(isolate, fn, message) { | |
| 903 this.isolate = isolate; | |
| 904 this.fn = fn; | |
| 905 this.message = message; | |
| 906 } | |
| 907 process() { | |
| 908 if (dart.notNull(this.isolate.isPaused)) { | |
| 909 this.isolate.delayedEvents[dartx.add](this); | |
| 910 return; | |
| 911 } | |
| 912 this.isolate.eval(this.fn); | |
| 913 } | |
| 914 } | |
| 915 dart.setSignature(_IsolateEvent, { | |
| 916 constructors: () => ({_IsolateEvent: [_IsolateEvent, [_IsolateContext, core.
Function, core.String]]}), | |
| 917 methods: () => ({process: [dart.void, []]}) | |
| 918 }); | |
| 919 dart.defineLazyProperties(exports, { | |
| 920 get _global() { | |
| 921 return typeof global == 'undefined' ? self : global; | |
| 922 } | |
| 923 }); | |
| 924 class _MainManagerStub extends core.Object { | |
| 925 postMessage(msg) { | |
| 926 exports._global.postMessage(msg); | |
| 927 } | |
| 928 } | |
| 929 dart.setSignature(_MainManagerStub, { | |
| 930 methods: () => ({postMessage: [dart.void, [dart.dynamic]]}) | |
| 931 }); | |
| 932 let _SPAWNED_SIGNAL = "spawned"; | |
| 933 let _SPAWN_FAILED_SIGNAL = "spawn failed"; | |
| 934 dart.copyProperties(exports, { | |
| 935 get globalWindow() { | |
| 936 return exports._global.window; | |
| 937 }, | |
| 938 get globalWorker() { | |
| 939 return exports._global.Worker; | |
| 940 }, | |
| 941 get globalPostMessageDefined() { | |
| 942 return !!exports._global.postMessage; | |
| 943 } | |
| 944 }); | |
| 945 let _MainFunction = dart.typedef('_MainFunction', () => dart.functionType(dart
.dynamic, [])); | |
| 946 let _MainFunctionArgs = dart.typedef('_MainFunctionArgs', () => dart.functionT
ype(dart.dynamic, [dart.dynamic])); | |
| 947 let _MainFunctionArgsMessage = dart.typedef('_MainFunctionArgsMessage', () =>
dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic])); | |
| 948 class IsolateNatives extends core.Object { | |
| 949 static computeThisScript() { | |
| 950 let currentScript = document.currentScript; | |
| 951 if (currentScript != null) { | |
| 952 return String(currentScript.src); | |
| 953 } | |
| 954 if (dart.notNull(_js_helper.Primitives.isD8)) | |
| 955 return IsolateNatives.computeThisScriptD8(); | |
| 956 if (dart.notNull(_js_helper.Primitives.isJsshell)) | |
| 957 return IsolateNatives.computeThisScriptJsshell(); | |
| 958 if (exports._globalState != null && dart.notNull(exports._globalState.isWo
rker)) { | |
| 959 return IsolateNatives.computeThisScriptFromTrace(); | |
| 960 } | |
| 961 return null; | |
| 962 } | |
| 963 static computeThisScriptJsshell() { | |
| 964 return dart.as(thisFilename(), core.String); | |
| 965 } | |
| 966 static computeThisScriptD8() { | |
| 967 return IsolateNatives.computeThisScriptFromTrace(); | |
| 968 } | |
| 969 static computeThisScriptFromTrace() { | |
| 970 let stack = new Error().stack; | |
| 971 if (stack == null) { | |
| 972 stack = (function() { | |
| 973 try { | |
| 974 throw new Error(); | |
| 975 } catch (e) { | |
| 976 return e.stack; | |
| 977 } | |
| 978 | |
| 979 })(); | |
| 980 if (stack == null) | |
| 981 dart.throw(new core.UnsupportedError('No stack trace')); | |
| 982 } | |
| 983 let pattern = null, matches = null; | |
| 984 pattern = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"); | |
| 985 matches = stack.match(pattern); | |
| 986 if (matches != null) | |
| 987 return matches[1]; | |
| 988 pattern = new RegExp("^[^@]*@(.*):[0-9]*$", "m"); | |
| 989 matches = stack.match(pattern); | |
| 990 if (matches != null) | |
| 991 return matches[1]; | |
| 992 dart.throw(new core.UnsupportedError(`Cannot extract URI from "${stack}"`)
); | |
| 993 } | |
| 994 static _getEventData(e) { | |
| 995 return e.data; | |
| 996 } | |
| 997 static _processWorkerMessage(sender, e) { | |
| 998 let msg = _deserializeMessage(IsolateNatives._getEventData(e)); | |
| 999 switch (dart.dindex(msg, 'command')) { | |
| 1000 case 'start': | |
| 1001 { | |
| 1002 exports._globalState.currentManagerId = dart.as(dart.dindex(msg, 'id')
, core.int); | |
| 1003 let functionName = dart.as(dart.dindex(msg, 'functionName'), core.Stri
ng); | |
| 1004 let entryPoint = functionName == null ? exports._globalState.entry : d
art.as(IsolateNatives._getJSFunctionFromName(functionName), core.Function); | |
| 1005 let args = dart.dindex(msg, 'args'); | |
| 1006 let message = _deserializeMessage(dart.dindex(msg, 'msg')); | |
| 1007 let isSpawnUri = dart.dindex(msg, 'isSpawnUri'); | |
| 1008 let startPaused = dart.dindex(msg, 'startPaused'); | |
| 1009 let replyTo = _deserializeMessage(dart.dindex(msg, 'replyTo')); | |
| 1010 let context = new _IsolateContext(); | |
| 1011 exports._globalState.topEventLoop.enqueue(context, dart.fn(() => { | |
| 1012 IsolateNatives._startIsolate(entryPoint, dart.as(args, core.List$(co
re.String)), message, dart.as(isSpawnUri, core.bool), dart.as(startPaused, core.
bool), dart.as(replyTo, isolate.SendPort)); | |
| 1013 }), 'worker-start'); | |
| 1014 exports._globalState.currentContext = context; | |
| 1015 exports._globalState.topEventLoop.run(); | |
| 1016 break; | |
| 1017 } | |
| 1018 case 'spawn-worker': | |
| 1019 { | |
| 1020 if (IsolateNatives.enableSpawnWorker != null) | |
| 1021 IsolateNatives.handleSpawnWorkerRequest(msg); | |
| 1022 break; | |
| 1023 } | |
| 1024 case 'message': | |
| 1025 { | |
| 1026 let port = dart.as(dart.dindex(msg, 'port'), isolate.SendPort); | |
| 1027 if (port != null) { | |
| 1028 dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg')
); | |
| 1029 } | |
| 1030 exports._globalState.topEventLoop.run(); | |
| 1031 break; | |
| 1032 } | |
| 1033 case 'close': | |
| 1034 { | |
| 1035 exports._globalState.managers.remove(IsolateNatives.workerIds.get(send
er)); | |
| 1036 sender.terminate(); | |
| 1037 exports._globalState.topEventLoop.run(); | |
| 1038 break; | |
| 1039 } | |
| 1040 case 'log': | |
| 1041 { | |
| 1042 IsolateNatives._log(dart.dindex(msg, 'msg')); | |
| 1043 break; | |
| 1044 } | |
| 1045 case 'print': | |
| 1046 { | |
| 1047 if (dart.notNull(exports._globalState.isWorker)) { | |
| 1048 exports._globalState.mainManager.postMessage(_serializeMessage(dart.
map({command: 'print', msg: msg}))); | |
| 1049 } else { | |
| 1050 core.print(dart.dindex(msg, 'msg')); | |
| 1051 } | |
| 1052 break; | |
| 1053 } | |
| 1054 case 'error': | |
| 1055 { | |
| 1056 dart.throw(dart.dindex(msg, 'msg')); | |
| 1057 } | |
| 1058 } | |
| 1059 } | |
| 1060 static handleSpawnWorkerRequest(msg) { | |
| 1061 let replyPort = dart.dindex(msg, 'replyPort'); | |
| 1062 IsolateNatives.spawn(dart.as(dart.dindex(msg, 'functionName'), core.String
), dart.as(dart.dindex(msg, 'uri'), core.String), dart.as(dart.dindex(msg, 'args
'), core.List$(core.String)), dart.dindex(msg, 'msg'), false, dart.as(dart.dinde
x(msg, 'isSpawnUri'), core.bool), dart.as(dart.dindex(msg, 'startPaused'), core.
bool)).then(dart.fn(msg => { | |
| 1063 dart.dsend(replyPort, 'send', msg); | |
| 1064 }), {onError: dart.fn(errorMessage => { | |
| 1065 dart.dsend(replyPort, 'send', [_SPAWN_FAILED_SIGNAL, errorMessage]); | |
| 1066 }, dart.dynamic, [core.String])}); | |
| 1067 } | |
| 1068 static _log(msg) { | |
| 1069 if (dart.notNull(exports._globalState.isWorker)) { | |
| 1070 exports._globalState.mainManager.postMessage(_serializeMessage(dart.map(
{command: 'log', msg: msg}))); | |
| 1071 } else { | |
| 1072 try { | |
| 1073 IsolateNatives._consoleLog(msg); | |
| 1074 } catch (e) { | |
| 1075 let trace = dart.stackTrace(e); | |
| 1076 dart.throw(core.Exception.new(trace)); | |
| 1077 } | |
| 1078 | |
| 1079 } | |
| 1080 } | |
| 1081 static _consoleLog(msg) { | |
| 1082 self.console.log(msg); | |
| 1083 } | |
| 1084 static _getJSFunctionFromName(functionName) { | |
| 1085 let globalFunctionsContainer = _foreign_helper.JS_EMBEDDED_GLOBAL("", _js_
embedded_names.GLOBAL_FUNCTIONS); | |
| 1086 return globalFunctionsContainer[functionName](); | |
| 1087 } | |
| 1088 static _getJSFunctionName(f) { | |
| 1089 return dart.as(f.$name, core.String); | |
| 1090 } | |
| 1091 static _allocate(ctor) { | |
| 1092 return new ctor(); | |
| 1093 } | |
| 1094 static spawnFunction(topLevelFunction, message, startPaused) { | |
| 1095 IsolateNatives.enableSpawnWorker = true; | |
| 1096 let name = IsolateNatives._getJSFunctionName(topLevelFunction); | |
| 1097 if (name == null) { | |
| 1098 dart.throw(new core.UnsupportedError("only top-level functions can be sp
awned.")); | |
| 1099 } | |
| 1100 let isLight = false; | |
| 1101 let isSpawnUri = false; | |
| 1102 return IsolateNatives.spawn(name, null, null, message, isLight, isSpawnUri
, startPaused); | |
| 1103 } | |
| 1104 static spawnUri(uri, args, message, startPaused) { | |
| 1105 IsolateNatives.enableSpawnWorker = true; | |
| 1106 let isLight = false; | |
| 1107 let isSpawnUri = true; | |
| 1108 return IsolateNatives.spawn(null, dart.toString(uri), args, message, isLig
ht, isSpawnUri, startPaused); | |
| 1109 } | |
| 1110 static spawn(functionName, uri, args, message, isLight, isSpawnUri, startPau
sed) { | |
| 1111 if (uri != null && dart.notNull(uri[dartx.endsWith](".dart"))) { | |
| 1112 uri = dart.notNull(uri) + ".js"; | |
| 1113 } | |
| 1114 let port = isolate.ReceivePort.new(); | |
| 1115 let completer = async.Completer$(core.List).new(); | |
| 1116 port.first.then(dart.fn(msg => { | |
| 1117 if (dart.equals(dart.dindex(msg, 0), _SPAWNED_SIGNAL)) { | |
| 1118 completer.complete(msg); | |
| 1119 } else { | |
| 1120 dart.assert(dart.equals(dart.dindex(msg, 0), _SPAWN_FAILED_SIGNAL)); | |
| 1121 completer.completeError(dart.dindex(msg, 1)); | |
| 1122 } | |
| 1123 })); | |
| 1124 let signalReply = port.sendPort; | |
| 1125 if (dart.notNull(exports._globalState.useWorkers) && !dart.notNull(isLight
)) { | |
| 1126 IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri
, startPaused, signalReply, dart.fn(message => completer.completeError(message),
dart.void, [core.String])); | |
| 1127 } else { | |
| 1128 IsolateNatives._startNonWorker(functionName, uri, args, message, isSpawn
Uri, startPaused, signalReply); | |
| 1129 } | |
| 1130 return completer.future; | |
| 1131 } | |
| 1132 static _startWorker(functionName, uri, args, message, isSpawnUri, startPause
d, replyPort, onError) { | |
| 1133 if (args != null) | |
| 1134 args = core.List$(core.String).from(args); | |
| 1135 if (dart.notNull(exports._globalState.isWorker)) { | |
| 1136 exports._globalState.mainManager.postMessage(_serializeMessage(dart.map(
{command: 'spawn-worker', functionName: functionName, args: args, msg: message,
uri: uri, isSpawnUri: isSpawnUri, startPaused: startPaused, replyPort: replyPort
}))); | |
| 1137 } else { | |
| 1138 IsolateNatives._spawnWorker(functionName, uri, args, message, isSpawnUri
, startPaused, replyPort, onError); | |
| 1139 } | |
| 1140 } | |
| 1141 static _startNonWorker(functionName, uri, args, message, isSpawnUri, startPa
used, replyPort) { | |
| 1142 if (uri != null) { | |
| 1143 dart.throw(new core.UnsupportedError("Currently spawnUri is not supporte
d without web workers.")); | |
| 1144 } | |
| 1145 message = _clone(message); | |
| 1146 if (args != null) | |
| 1147 args = core.List$(core.String).from(args); | |
| 1148 exports._globalState.topEventLoop.enqueue(new _IsolateContext(), dart.fn((
) => { | |
| 1149 let func = IsolateNatives._getJSFunctionFromName(functionName); | |
| 1150 IsolateNatives._startIsolate(dart.as(func, core.Function), args, message
, isSpawnUri, startPaused, replyPort); | |
| 1151 }), 'nonworker start'); | |
| 1152 } | |
| 1153 static get currentIsolate() { | |
| 1154 let context = dart.as(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT(), _Isola
teContext); | |
| 1155 return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability:
context.pauseCapability, terminateCapability: context.terminateCapability}); | |
| 1156 } | |
| 1157 static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, reply
To) { | |
| 1158 let context = dart.as(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT(), _Isola
teContext); | |
| 1159 _js_helper.Primitives.initializeStatics(context.id); | |
| 1160 replyTo.send([_SPAWNED_SIGNAL, context.controlPort.sendPort, context.pause
Capability, context.terminateCapability]); | |
| 1161 function runStartFunction() { | |
| 1162 context.initialized = true; | |
| 1163 if (!dart.notNull(isSpawnUri)) { | |
| 1164 dart.dcall(topLevel, message); | |
| 1165 } else if (dart.is(topLevel, _MainFunctionArgsMessage)) { | |
| 1166 dart.dcall(topLevel, args, message); | |
| 1167 } else if (dart.is(topLevel, _MainFunctionArgs)) { | |
| 1168 dart.dcall(topLevel, args); | |
| 1169 } else { | |
| 1170 dart.dcall(topLevel); | |
| 1171 } | |
| 1172 } | |
| 1173 dart.fn(runStartFunction, dart.void, []); | |
| 1174 if (dart.notNull(startPaused)) { | |
| 1175 context.addPause(context.pauseCapability, context.pauseCapability); | |
| 1176 exports._globalState.topEventLoop.enqueue(context, runStartFunction, 'st
art isolate'); | |
| 1177 } else { | |
| 1178 runStartFunction(); | |
| 1179 } | |
| 1180 } | |
| 1181 static _spawnWorker(functionName, uri, args, message, isSpawnUri, startPause
d, replyPort, onError) { | |
| 1182 if (uri == null) | |
| 1183 uri = IsolateNatives.thisScript; | |
| 1184 let worker = new Worker(uri); | |
| 1185 let onerrorTrampoline = (function(f, u, c) { | |
| 1186 return function(e) { | |
| 1187 return f(e, u, c); | |
| 1188 }; | |
| 1189 })(IsolateNatives.workerOnError, uri, onError); | |
| 1190 worker.onerror = onerrorTrampoline; | |
| 1191 let processWorkerMessageTrampoline = (function(f, a) { | |
| 1192 return function(e) { | |
| 1193 e.onerror = null; | |
| 1194 return f(a, e); | |
| 1195 }; | |
| 1196 })(IsolateNatives._processWorkerMessage, worker); | |
| 1197 worker.onmessage = processWorkerMessageTrampoline; | |
| 1198 let o = exports._globalState; | |
| 1199 let workerId = o.nextManagerId; | |
| 1200 o.nextManagerId = dart.notNull(workerId) + 1; | |
| 1201 IsolateNatives.workerIds.set(worker, workerId); | |
| 1202 exports._globalState.managers.set(workerId, worker); | |
| 1203 worker.postMessage(_serializeMessage(dart.map({command: 'start', id: worke
rId, replyTo: _serializeMessage(replyPort), args: args, msg: _serializeMessage(m
essage), isSpawnUri: isSpawnUri, startPaused: startPaused, functionName: functio
nName}))); | |
| 1204 } | |
| 1205 static workerOnError(event, uri, onError) { | |
| 1206 event.preventDefault(); | |
| 1207 let message = dart.as(event.message, core.String); | |
| 1208 if (message == null) { | |
| 1209 message = `Error spawning worker for ${uri}`; | |
| 1210 } else { | |
| 1211 message = `Error spawning worker for ${uri} (${message})`; | |
| 1212 } | |
| 1213 onError(message); | |
| 1214 return true; | |
| 1215 } | |
| 1216 } | |
| 1217 dart.setSignature(IsolateNatives, { | |
| 1218 statics: () => ({ | |
| 1219 computeThisScript: [core.String, []], | |
| 1220 computeThisScriptJsshell: [core.String, []], | |
| 1221 computeThisScriptD8: [core.String, []], | |
| 1222 computeThisScriptFromTrace: [core.String, []], | |
| 1223 _getEventData: [dart.dynamic, [dart.dynamic]], | |
| 1224 _processWorkerMessage: [dart.void, [dart.dynamic, dart.dynamic]], | |
| 1225 handleSpawnWorkerRequest: [dart.dynamic, [dart.dynamic]], | |
| 1226 _log: [dart.dynamic, [dart.dynamic]], | |
| 1227 _consoleLog: [dart.void, [dart.dynamic]], | |
| 1228 _getJSFunctionFromName: [dart.dynamic, [core.String]], | |
| 1229 _getJSFunctionName: [core.String, [core.Function]], | |
| 1230 _allocate: [dart.dynamic, [dart.dynamic]], | |
| 1231 spawnFunction: [async.Future$(core.List), [dart.functionType(dart.void, [d
art.dynamic]), dart.dynamic, core.bool]], | |
| 1232 spawnUri: [async.Future$(core.List), [core.Uri, core.List$(core.String), d
art.dynamic, core.bool]], | |
| 1233 spawn: [async.Future$(core.List), [core.String, core.String, core.List$(co
re.String), dart.dynamic, core.bool, core.bool, core.bool]], | |
| 1234 _startWorker: [dart.void, [core.String, core.String, core.List$(core.Strin
g), dart.dynamic, core.bool, core.bool, isolate.SendPort, dart.functionType(dart
.void, [core.String])]], | |
| 1235 _startNonWorker: [dart.void, [core.String, core.String, core.List$(core.St
ring), dart.dynamic, core.bool, core.bool, isolate.SendPort]], | |
| 1236 _startIsolate: [dart.void, [core.Function, core.List$(core.String), dart.d
ynamic, core.bool, core.bool, isolate.SendPort]], | |
| 1237 _spawnWorker: [dart.void, [dart.dynamic, core.String, core.List$(core.Stri
ng), dart.dynamic, core.bool, core.bool, isolate.SendPort, dart.functionType(dar
t.void, [core.String])]], | |
| 1238 workerOnError: [core.bool, [dart.dynamic, core.String, dart.functionType(d
art.void, [core.String])]] | |
| 1239 }), | |
| 1240 names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD
8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'han
dleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJS
FunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker'
, '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError'] | |
| 1241 }); | |
| 1242 IsolateNatives.enableSpawnWorker = null; | |
| 1243 dart.defineLazyProperties(IsolateNatives, { | |
| 1244 get thisScript() { | |
| 1245 return IsolateNatives.computeThisScript(); | |
| 1246 }, | |
| 1247 set thisScript(_) {}, | |
| 1248 get workerIds() { | |
| 1249 return new (core.Expando$(core.int))(); | |
| 1250 } | |
| 1251 }); | |
| 1252 let _checkReplyTo = Symbol('_checkReplyTo'); | |
| 1253 class _BaseSendPort extends core.Object { | |
| 1254 _BaseSendPort(isolateId) { | |
| 1255 this[_isolateId] = isolateId; | |
| 1256 } | |
| 1257 [_checkReplyTo](replyTo) { | |
| 1258 if (replyTo != null && !dart.is(replyTo, _NativeJsSendPort) && !dart.is(re
plyTo, _WorkerSendPort)) { | |
| 1259 dart.throw(core.Exception.new("SendPort.send: Illegal replyTo port type"
)); | |
| 1260 } | |
| 1261 } | |
| 1262 } | |
| 1263 _BaseSendPort[dart.implements] = () => [isolate.SendPort]; | |
| 1264 dart.setSignature(_BaseSendPort, { | |
| 1265 constructors: () => ({_BaseSendPort: [_BaseSendPort, [core.int]]}), | |
| 1266 methods: () => ({[_checkReplyTo]: [dart.void, [isolate.SendPort]]}) | |
| 1267 }); | |
| 1268 let _isClosed = Symbol('_isClosed'); | |
| 1269 let _add = Symbol('_add'); | |
| 1270 class _NativeJsSendPort extends _BaseSendPort { | |
| 1271 _NativeJsSendPort(receivePort, isolateId) { | |
| 1272 this[_receivePort] = receivePort; | |
| 1273 super._BaseSendPort(isolateId); | |
| 1274 } | |
| 1275 send(message) { | |
| 1276 let isolate = exports._globalState.isolates.get(this[_isolateId]); | |
| 1277 if (isolate == null) | |
| 1278 return; | |
| 1279 if (dart.notNull(this[_receivePort][_isClosed])) | |
| 1280 return; | |
| 1281 let msg = _clone(message); | |
| 1282 if (dart.equals(isolate.controlPort, this[_receivePort])) { | |
| 1283 isolate.handleControlMessage(msg); | |
| 1284 return; | |
| 1285 } | |
| 1286 exports._globalState.topEventLoop.enqueue(isolate, dart.fn((() => { | |
| 1287 if (!dart.notNull(this[_receivePort][_isClosed])) { | |
| 1288 this[_receivePort][_add](msg); | |
| 1289 } | |
| 1290 }).bind(this)), `receive ${message}`); | |
| 1291 } | |
| 1292 ['=='](other) { | |
| 1293 return dart.is(other, _NativeJsSendPort) && dart.equals(this[_receivePort]
, dart.dload(other, _receivePort)); | |
| 1294 } | |
| 1295 get hashCode() { | |
| 1296 return this[_receivePort][_id]; | |
| 1297 } | |
| 1298 } | |
| 1299 _NativeJsSendPort[dart.implements] = () => [isolate.SendPort]; | |
| 1300 dart.setSignature(_NativeJsSendPort, { | |
| 1301 constructors: () => ({_NativeJsSendPort: [_NativeJsSendPort, [RawReceivePort
Impl, core.int]]}), | |
| 1302 methods: () => ({send: [dart.void, [dart.dynamic]]}) | |
| 1303 }); | |
| 1304 class _WorkerSendPort extends _BaseSendPort { | |
| 1305 _WorkerSendPort(workerId, isolateId, receivePortId) { | |
| 1306 this[_workerId] = workerId; | |
| 1307 this[_receivePortId] = receivePortId; | |
| 1308 super._BaseSendPort(isolateId); | |
| 1309 } | |
| 1310 send(message) { | |
| 1311 let workerMessage = _serializeMessage(dart.map({command: 'message', port:
this, msg: message})); | |
| 1312 if (dart.notNull(exports._globalState.isWorker)) { | |
| 1313 exports._globalState.mainManager.postMessage(workerMessage); | |
| 1314 } else { | |
| 1315 let manager = exports._globalState.managers.get(this[_workerId]); | |
| 1316 if (manager != null) { | |
| 1317 manager.postMessage(workerMessage); | |
| 1318 } | |
| 1319 } | |
| 1320 } | |
| 1321 ['=='](other) { | |
| 1322 return dart.is(other, _WorkerSendPort) && dart.equals(this[_workerId], dar
t.dload(other, _workerId)) && dart.equals(this[_isolateId], dart.dload(other, _i
solateId)) && dart.equals(this[_receivePortId], dart.dload(other, _receivePortId
)); | |
| 1323 } | |
| 1324 get hashCode() { | |
| 1325 return dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]
) << 8 ^ dart.notNull(this[_receivePortId]); | |
| 1326 } | |
| 1327 } | |
| 1328 _WorkerSendPort[dart.implements] = () => [isolate.SendPort]; | |
| 1329 dart.setSignature(_WorkerSendPort, { | |
| 1330 constructors: () => ({_WorkerSendPort: [_WorkerSendPort, [core.int, core.int
, core.int]]}), | |
| 1331 methods: () => ({send: [dart.void, [dart.dynamic]]}) | |
| 1332 }); | |
| 1333 let _handler = Symbol('_handler'); | |
| 1334 class RawReceivePortImpl extends core.Object { | |
| 1335 RawReceivePortImpl(handler) { | |
| 1336 this[_handler] = handler; | |
| 1337 this[_id] = (() => { | |
| 1338 let x = RawReceivePortImpl._nextFreeId; | |
| 1339 RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1; | |
| 1340 return x; | |
| 1341 })(); | |
| 1342 this[_isClosed] = false; | |
| 1343 exports._globalState.currentContext.register(this[_id], this); | |
| 1344 } | |
| 1345 weak(handler) { | |
| 1346 this[_handler] = handler; | |
| 1347 this[_id] = (() => { | |
| 1348 let x = RawReceivePortImpl._nextFreeId; | |
| 1349 RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1; | |
| 1350 return x; | |
| 1351 })(); | |
| 1352 this[_isClosed] = false; | |
| 1353 exports._globalState.currentContext.registerWeak(this[_id], this); | |
| 1354 } | |
| 1355 _controlPort() { | |
| 1356 this[_handler] = null; | |
| 1357 this[_id] = 0; | |
| 1358 this[_isClosed] = false; | |
| 1359 } | |
| 1360 set handler(newHandler) { | |
| 1361 this[_handler] = newHandler; | |
| 1362 } | |
| 1363 [_close]() { | |
| 1364 this[_isClosed] = true; | |
| 1365 this[_handler] = null; | |
| 1366 } | |
| 1367 close() { | |
| 1368 if (dart.notNull(this[_isClosed])) | |
| 1369 return; | |
| 1370 this[_isClosed] = true; | |
| 1371 this[_handler] = null; | |
| 1372 exports._globalState.currentContext.unregister(this[_id]); | |
| 1373 } | |
| 1374 [_add](dataEvent) { | |
| 1375 if (dart.notNull(this[_isClosed])) | |
| 1376 return; | |
| 1377 dart.dcall(this[_handler], dataEvent); | |
| 1378 } | |
| 1379 get sendPort() { | |
| 1380 return new _NativeJsSendPort(this, exports._globalState.currentContext.id)
; | |
| 1381 } | |
| 1382 } | |
| 1383 RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort]; | |
| 1384 dart.defineNamedConstructor(RawReceivePortImpl, 'weak'); | |
| 1385 dart.defineNamedConstructor(RawReceivePortImpl, '_controlPort'); | |
| 1386 dart.setSignature(RawReceivePortImpl, { | |
| 1387 constructors: () => ({ | |
| 1388 RawReceivePortImpl: [RawReceivePortImpl, [core.Function]], | |
| 1389 weak: [RawReceivePortImpl, [core.Function]], | |
| 1390 _controlPort: [RawReceivePortImpl, []] | |
| 1391 }), | |
| 1392 methods: () => ({ | |
| 1393 [_close]: [dart.void, []], | |
| 1394 close: [dart.void, []], | |
| 1395 [_add]: [dart.void, [dart.dynamic]] | |
| 1396 }) | |
| 1397 }); | |
| 1398 RawReceivePortImpl._nextFreeId = 1; | |
| 1399 let _rawPort = Symbol('_rawPort'); | |
| 1400 let _controller = Symbol('_controller'); | |
| 1401 class ReceivePortImpl extends async.Stream { | |
| 1402 ReceivePortImpl() { | |
| 1403 this.fromRawReceivePort(new RawReceivePortImpl(null)); | |
| 1404 } | |
| 1405 weak() { | |
| 1406 this.fromRawReceivePort(new RawReceivePortImpl.weak(null)); | |
| 1407 } | |
| 1408 fromRawReceivePort(rawPort) { | |
| 1409 this[_rawPort] = rawPort; | |
| 1410 this[_controller] = null; | |
| 1411 super.Stream(); | |
| 1412 this[_controller] = async.StreamController.new({onCancel: dart.bind(this,
'close'), sync: true}); | |
| 1413 this[_rawPort].handler = dart.bind(this[_controller], 'add'); | |
| 1414 } | |
| 1415 listen(onData, opts) { | |
| 1416 let onError = opts && 'onError' in opts ? opts.onError : null; | |
| 1417 let onDone = opts && 'onDone' in opts ? opts.onDone : null; | |
| 1418 let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError :
null; | |
| 1419 return this[_controller].stream.listen(onData, {onError: onError, onDone:
onDone, cancelOnError: cancelOnError}); | |
| 1420 } | |
| 1421 close() { | |
| 1422 this[_rawPort].close(); | |
| 1423 this[_controller].close(); | |
| 1424 } | |
| 1425 get sendPort() { | |
| 1426 return this[_rawPort].sendPort; | |
| 1427 } | |
| 1428 } | |
| 1429 ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort]; | |
| 1430 dart.defineNamedConstructor(ReceivePortImpl, 'weak'); | |
| 1431 dart.defineNamedConstructor(ReceivePortImpl, 'fromRawReceivePort'); | |
| 1432 dart.setSignature(ReceivePortImpl, { | |
| 1433 constructors: () => ({ | |
| 1434 ReceivePortImpl: [ReceivePortImpl, []], | |
| 1435 weak: [ReceivePortImpl, []], | |
| 1436 fromRawReceivePort: [ReceivePortImpl, [isolate.RawReceivePort]] | |
| 1437 }), | |
| 1438 methods: () => ({ | |
| 1439 listen: [async.StreamSubscription, [dart.functionType(dart.void, [dart.dyn
amic])], {onError: core.Function, onDone: dart.functionType(dart.void, []), canc
elOnError: core.bool}], | |
| 1440 close: [dart.void, []] | |
| 1441 }) | |
| 1442 }); | |
| 1443 let _once = Symbol('_once'); | |
| 1444 let _inEventLoop = Symbol('_inEventLoop'); | |
| 1445 let _handle = Symbol('_handle'); | |
| 1446 class TimerImpl extends core.Object { | |
| 1447 TimerImpl(milliseconds, callback) { | |
| 1448 this[_once] = true; | |
| 1449 this[_inEventLoop] = false; | |
| 1450 this[_handle] = null; | |
| 1451 if (milliseconds == 0 && (!dart.notNull(hasTimer()) || dart.notNull(export
s._globalState.isWorker))) { | |
| 1452 let internalCallback = (function() { | |
| 1453 this[_handle] = null; | |
| 1454 callback(); | |
| 1455 }).bind(this); | |
| 1456 dart.fn(internalCallback, dart.void, []); | |
| 1457 this[_handle] = 1; | |
| 1458 exports._globalState.topEventLoop.enqueue(exports._globalState.currentCo
ntext, internalCallback, 'timer'); | |
| 1459 this[_inEventLoop] = true; | |
| 1460 } else if (dart.notNull(hasTimer())) { | |
| 1461 let internalCallback = (function() { | |
| 1462 this[_handle] = null; | |
| 1463 leaveJsAsync(); | |
| 1464 callback(); | |
| 1465 }).bind(this); | |
| 1466 dart.fn(internalCallback, dart.void, []); | |
| 1467 enterJsAsync(); | |
| 1468 this[_handle] = self.setTimeout(internalCallback, milliseconds); | |
| 1469 } else { | |
| 1470 dart.assert(dart.notNull(milliseconds) > 0); | |
| 1471 dart.throw(new core.UnsupportedError("Timer greater than 0.")); | |
| 1472 } | |
| 1473 } | |
| 1474 periodic(milliseconds, callback) { | |
| 1475 this[_once] = false; | |
| 1476 this[_inEventLoop] = false; | |
| 1477 this[_handle] = null; | |
| 1478 if (dart.notNull(hasTimer())) { | |
| 1479 enterJsAsync(); | |
| 1480 this[_handle] = self.setInterval(dart.fn((() => { | |
| 1481 callback(this); | |
| 1482 }).bind(this)), milliseconds); | |
| 1483 } else { | |
| 1484 dart.throw(new core.UnsupportedError("Periodic timer.")); | |
| 1485 } | |
| 1486 } | |
| 1487 cancel() { | |
| 1488 if (dart.notNull(hasTimer())) { | |
| 1489 if (dart.notNull(this[_inEventLoop])) { | |
| 1490 dart.throw(new core.UnsupportedError("Timer in event loop cannot be ca
nceled.")); | |
| 1491 } | |
| 1492 if (this[_handle] == null) | |
| 1493 return; | |
| 1494 leaveJsAsync(); | |
| 1495 if (dart.notNull(this[_once])) { | |
| 1496 self.clearTimeout(this[_handle]); | |
| 1497 } else { | |
| 1498 self.clearInterval(this[_handle]); | |
| 1499 } | |
| 1500 this[_handle] = null; | |
| 1501 } else { | |
| 1502 dart.throw(new core.UnsupportedError("Canceling a timer.")); | |
| 1503 } | |
| 1504 } | |
| 1505 get isActive() { | |
| 1506 return this[_handle] != null; | |
| 1507 } | |
| 1508 } | |
| 1509 TimerImpl[dart.implements] = () => [async.Timer]; | |
| 1510 dart.defineNamedConstructor(TimerImpl, 'periodic'); | |
| 1511 dart.setSignature(TimerImpl, { | |
| 1512 constructors: () => ({ | |
| 1513 TimerImpl: [TimerImpl, [core.int, dart.functionType(dart.void, [])]], | |
| 1514 periodic: [TimerImpl, [core.int, dart.functionType(dart.void, [async.Timer
])]] | |
| 1515 }), | |
| 1516 methods: () => ({cancel: [dart.void, []]}) | |
| 1517 }); | |
| 1518 function hasTimer() { | |
| 1519 return self.setTimeout != null; | |
| 1520 } | |
| 1521 dart.fn(hasTimer, core.bool, []); | |
| 1522 class CapabilityImpl extends core.Object { | |
| 1523 CapabilityImpl() { | |
| 1524 this._internal(_js_helper.random64()); | |
| 1525 } | |
| 1526 _internal(id) { | |
| 1527 this[_id] = id; | |
| 1528 } | |
| 1529 get hashCode() { | |
| 1530 let hash = this[_id]; | |
| 1531 hash = dart.notNull(hash) >> 0 ^ (dart.notNull(hash) / 4294967296)[dartx.t
runcate](); | |
| 1532 hash = ~dart.notNull(hash) + (dart.notNull(hash) << 15) & 4294967295; | |
| 1533 hash = dart.notNull(hash) ^ dart.notNull(hash) >> 12; | |
| 1534 hash = dart.notNull(hash) * 5 & 4294967295; | |
| 1535 hash = dart.notNull(hash) ^ dart.notNull(hash) >> 4; | |
| 1536 hash = dart.notNull(hash) * 2057 & 4294967295; | |
| 1537 hash = dart.notNull(hash) ^ dart.notNull(hash) >> 16; | |
| 1538 return hash; | |
| 1539 } | |
| 1540 ['=='](other) { | |
| 1541 if (dart.notNull(core.identical(other, this))) | |
| 1542 return true; | |
| 1543 if (dart.is(other, CapabilityImpl)) { | |
| 1544 return core.identical(this[_id], other[_id]); | |
| 1545 } | |
| 1546 return false; | |
| 1547 } | |
| 1548 } | |
| 1549 CapabilityImpl[dart.implements] = () => [isolate.Capability]; | |
| 1550 dart.defineNamedConstructor(CapabilityImpl, '_internal'); | |
| 1551 dart.setSignature(CapabilityImpl, { | |
| 1552 constructors: () => ({ | |
| 1553 CapabilityImpl: [CapabilityImpl, []], | |
| 1554 _internal: [CapabilityImpl, [core.int]] | |
| 1555 }), | |
| 1556 methods: () => ({'==': [core.bool, [core.Object]]}) | |
| 1557 }); | |
| 1558 // Exports: | |
| 1559 exports.enterJsAsync = enterJsAsync; | |
| 1560 exports.leaveJsAsync = leaveJsAsync; | |
| 1561 exports.isWorker = isWorker; | |
| 1562 exports.startRootIsolate = startRootIsolate; | |
| 1563 exports.IsolateNatives = IsolateNatives; | |
| 1564 exports.RawReceivePortImpl = RawReceivePortImpl; | |
| 1565 exports.ReceivePortImpl = ReceivePortImpl; | |
| 1566 exports.TimerImpl = TimerImpl; | |
| 1567 exports.hasTimer = hasTimer; | |
| 1568 exports.CapabilityImpl = CapabilityImpl; | |
| 1569 }); | |
| OLD | NEW |