| Index: pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
|
| diff --git a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
|
| index a6310d5d8316d43e3a185d0825144f3562a03c04..971840f56e2689438ac1d5884088cb4b426c795d 100644
|
| --- a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
|
| +++ b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
|
| @@ -4,41 +4,41 @@
|
|
|
| library dart._isolate_helper;
|
|
|
| -import 'dart:_js_embedded_names' show
|
| - CLASS_ID_EXTRACTOR,
|
| - CLASS_FIELDS_EXTRACTOR,
|
| - CURRENT_SCRIPT,
|
| - GLOBAL_FUNCTIONS,
|
| - INITIALIZE_EMPTY_INSTANCE,
|
| - INSTANCE_FROM_CLASS_ID;
|
| +import 'dart:_js_embedded_names'
|
| + show
|
| + CLASS_ID_EXTRACTOR,
|
| + CLASS_FIELDS_EXTRACTOR,
|
| + CURRENT_SCRIPT,
|
| + GLOBAL_FUNCTIONS,
|
| + INITIALIZE_EMPTY_INSTANCE,
|
| + INSTANCE_FROM_CLASS_ID;
|
|
|
| import 'dart:async';
|
| import 'dart:collection' show Queue, HashMap;
|
| import 'dart:isolate';
|
| import 'dart:_native_typed_data' show NativeByteBuffer, NativeTypedData;
|
|
|
| -import 'dart:_js_helper' show
|
| - InternalMap,
|
| - Null,
|
| - Primitives,
|
| - random64;
|
| -
|
| -import 'dart:_foreign_helper' show JS,
|
| - JS_CREATE_ISOLATE,
|
| - JS_CURRENT_ISOLATE_CONTEXT,
|
| - JS_CURRENT_ISOLATE,
|
| - JS_EMBEDDED_GLOBAL,
|
| - JS_SET_CURRENT_ISOLATE,
|
| - IsolateContext;
|
| -
|
| -import 'dart:_interceptors' show Interceptor,
|
| - JSArray,
|
| - JSExtendableArray,
|
| - JSFixedArray,
|
| - JSIndexable,
|
| - JSMutableArray,
|
| - JSObject;
|
| -
|
| +import 'dart:_js_helper' show InternalMap, Null, Primitives, random64;
|
| +
|
| +import 'dart:_foreign_helper'
|
| + show
|
| + JS,
|
| + JS_CREATE_ISOLATE,
|
| + JS_CURRENT_ISOLATE_CONTEXT,
|
| + JS_CURRENT_ISOLATE,
|
| + JS_EMBEDDED_GLOBAL,
|
| + JS_SET_CURRENT_ISOLATE,
|
| + IsolateContext;
|
| +
|
| +import 'dart:_interceptors'
|
| + show
|
| + Interceptor,
|
| + JSArray,
|
| + JSExtendableArray,
|
| + JSFixedArray,
|
| + JSIndexable,
|
| + JSMutableArray,
|
| + JSObject;
|
|
|
| part 'isolate_serialization.dart';
|
|
|
| @@ -110,9 +110,13 @@ void startRootIsolate(entry, args) {
|
| // by having a "default" isolate (the first one created).
|
| _globalState.currentContext = rootContext;
|
| if (entry is _MainFunctionArgs) {
|
| - rootContext.eval(() { entry(args); });
|
| + rootContext.eval(() {
|
| + entry(args);
|
| + });
|
| } else if (entry is _MainFunctionArgsMessage) {
|
| - rootContext.eval(() { entry(args, null); });
|
| + rootContext.eval(() {
|
| + entry(args, null);
|
| + });
|
| } else {
|
| rootContext.eval(entry);
|
| }
|
| @@ -166,7 +170,6 @@ set _globalState(_Manager val) {
|
| /** State associated with the current manager. See [globalState]. */
|
| // TODO(sigmund): split in multiple classes: global, thread, main-worker states?
|
| class _Manager {
|
| -
|
| /** Next available isolate id within this [_Manager]. */
|
| int nextIsolateId = 0;
|
|
|
| @@ -214,7 +217,7 @@ class _Manager {
|
| _MainManagerStub mainManager;
|
|
|
| /// Registry of active Web Workers. Only used in the main [_Manager].
|
| - Map<int, dynamic /* Worker */> managers;
|
| + Map<int, dynamic /* Worker */ > managers;
|
|
|
| /** The entry point given by [startRootIsolate]. */
|
| final Function entry;
|
| @@ -224,7 +227,8 @@ class _Manager {
|
| topEventLoop = new _EventLoop();
|
| isolates = new Map<int, _IsolateContext>();
|
| managers = new Map<int, dynamic>();
|
| - if (isWorker) { // "if we are not the main manager ourself" is the intent.
|
| + if (isWorker) {
|
| + // "if we are not the main manager ourself" is the intent.
|
| mainManager = new _MainManagerStub();
|
| _nativeInitWorkerMessageHandler();
|
| }
|
| @@ -235,20 +239,23 @@ class _Manager {
|
| bool isWorkerDefined = globalWorker != null;
|
|
|
| isWorker = !isWindowDefined && globalPostMessageDefined;
|
| - supportsWorkers = isWorker
|
| - || (isWorkerDefined && IsolateNatives.thisScript != null);
|
| + supportsWorkers =
|
| + isWorker || (isWorkerDefined && IsolateNatives.thisScript != null);
|
| fromCommandLine = !isWindowDefined && !isWorker;
|
| }
|
|
|
| void _nativeInitWorkerMessageHandler() {
|
| - var function = JS('',
|
| + var function = JS(
|
| + '',
|
| "(function (f, a) { return function (e) { f(a, e); }})(#, #)",
|
| IsolateNatives._processWorkerMessage,
|
| mainManager);
|
| JS("void", r"#.onmessage = #", global, function);
|
| // We ensure dartPrint is defined so that the implementation of the Dart
|
| // print method knows what to call.
|
| - JS('', '''#.dartPrint = #.dartPrint || (function(serialize) {
|
| + JS(
|
| + '',
|
| + '''#.dartPrint = #.dartPrint || (function(serialize) {
|
| return function (object) {
|
| var _self = #;
|
| if (_self.console && _self.console.log) {
|
| @@ -257,7 +264,11 @@ class _Manager {
|
| _self.postMessage(serialize(object));
|
| }
|
| }
|
| -})(#)''', global, global, global, _serializePrintMessage);
|
| +})(#)''',
|
| + global,
|
| + global,
|
| + global,
|
| + _serializePrintMessage);
|
| }
|
|
|
| static _serializePrintMessage(object) {
|
| @@ -269,9 +280,7 @@ class _Manager {
|
| * there are no active async JavaScript tasks still running.
|
| */
|
| void maybeCloseWorker() {
|
| - if (isWorker
|
| - && isolates.isEmpty
|
| - && topEventLoop._activeJsAsyncCount == 0) {
|
| + if (isWorker && isolates.isEmpty && topEventLoop._activeJsAsyncCount == 0) {
|
| mainManager.postMessage(_serializeMessage({'command': 'close'}));
|
| }
|
| }
|
| @@ -295,7 +304,7 @@ class _IsolateContext implements IsolateContext {
|
| final RawReceivePortImpl controlPort = new RawReceivePortImpl._controlPort();
|
|
|
| final Capability pauseCapability = new Capability();
|
| - final Capability terminateCapability = new Capability(); // License to kill.
|
| + final Capability terminateCapability = new Capability(); // License to kill.
|
|
|
| /// Boolean flag set when the initial method of the isolate has been executed.
|
| ///
|
| @@ -345,7 +354,7 @@ class _IsolateContext implements IsolateContext {
|
| if (!isPaused) return;
|
| pauseTokens.remove(resume);
|
| if (pauseTokens.isEmpty) {
|
| - while(delayedEvents.isNotEmpty) {
|
| + while (delayedEvents.isNotEmpty) {
|
| _IsolateEvent event = delayedEvents.removeLast();
|
| _globalState.topEventLoop.prequeue(event);
|
| }
|
| @@ -376,12 +385,14 @@ class _IsolateContext implements IsolateContext {
|
|
|
| void handlePing(SendPort responsePort, int pingType) {
|
| if (pingType == Isolate.IMMEDIATE ||
|
| - (pingType == Isolate.BEFORE_NEXT_EVENT &&
|
| - !_isExecutingEvent)) {
|
| + (pingType == Isolate.BEFORE_NEXT_EVENT && !_isExecutingEvent)) {
|
| responsePort.send(null);
|
| return;
|
| }
|
| - void respond() { responsePort.send(null); }
|
| + void respond() {
|
| + responsePort.send(null);
|
| + }
|
| +
|
| assert(pingType == Isolate.BEFORE_NEXT_EVENT);
|
| if (_scheduledControlEvents == null) {
|
| _scheduledControlEvents = new Queue();
|
| @@ -392,8 +403,7 @@ class _IsolateContext implements IsolateContext {
|
| void handleKill(Capability authentification, int priority) {
|
| if (this.terminateCapability != authentification) return;
|
| if (priority == Isolate.IMMEDIATE ||
|
| - (priority == Isolate.BEFORE_NEXT_EVENT &&
|
| - !_isExecutingEvent)) {
|
| + (priority == Isolate.BEFORE_NEXT_EVENT && !_isExecutingEvent)) {
|
| kill();
|
| return;
|
| }
|
| @@ -431,8 +441,8 @@ class _IsolateContext implements IsolateContext {
|
| return;
|
| }
|
| List message = new List(2)
|
| - ..[0] = error.toString()
|
| - ..[1] = (stackTrace == null) ? null : stackTrace.toString();
|
| + ..[0] = error.toString()
|
| + ..[1] = (stackTrace == null) ? null : stackTrace.toString();
|
| for (SendPort port in errorPorts) port.send(message);
|
| }
|
|
|
| @@ -524,7 +534,7 @@ class _IsolateContext implements IsolateContext {
|
| }
|
|
|
| /** Registers a port on this isolate. */
|
| - void register(int portId, RawReceivePortImpl port) {
|
| + void register(int portId, RawReceivePortImpl port) {
|
| _addRegistration(portId, port);
|
| _updateGlobalState();
|
| }
|
| @@ -534,7 +544,7 @@ class _IsolateContext implements IsolateContext {
|
| *
|
| * The port does not keep the isolate active.
|
| */
|
| - void registerWeak(int portId, RawReceivePortImpl port) {
|
| + void registerWeak(int portId, RawReceivePortImpl port) {
|
| weakPorts.add(portId);
|
| _addRegistration(portId, port);
|
| }
|
| @@ -607,10 +617,10 @@ class _EventLoop {
|
| }
|
|
|
| void checkOpenReceivePortsFromCommandLine() {
|
| - if (_globalState.rootContext != null
|
| - && _globalState.isolates.containsKey(_globalState.rootContext.id)
|
| - && _globalState.fromCommandLine
|
| - && _globalState.rootContext.ports.isEmpty) {
|
| + if (_globalState.rootContext != null &&
|
| + _globalState.isolates.containsKey(_globalState.rootContext.id) &&
|
| + _globalState.fromCommandLine &&
|
| + _globalState.rootContext.ports.isEmpty) {
|
| // We want to reach here only on the main [_Manager] and only
|
| // on the command-line. In the browser the isolate might
|
| // still be alive due to DOM callbacks, but the presumption is
|
| @@ -645,6 +655,7 @@ class _EventLoop {
|
| if (!runIteration()) return;
|
| Timer.run(next);
|
| }
|
| +
|
| next();
|
| } else {
|
| // Run synchronously until no more iterations are available.
|
| @@ -662,8 +673,8 @@ class _EventLoop {
|
| try {
|
| _runHelper();
|
| } catch (e, trace) {
|
| - _globalState.mainManager.postMessage(_serializeMessage(
|
| - {'command': 'error', 'msg': '$e\n$trace' }));
|
| + _globalState.mainManager.postMessage(
|
| + _serializeMessage({'command': 'error', 'msg': '$e\n$trace'}));
|
| }
|
| }
|
| }
|
| @@ -693,8 +704,7 @@ class _IsolateEvent {
|
| //
|
| // See: http://www.w3.org/TR/workers/#the-global-scope
|
| // and: http://www.w3.org/TR/Window/#dfn-self-attribute
|
| -final global =
|
| - JS("", "typeof global == 'undefined' ? self : global");
|
| +final global = JS("", "typeof global == 'undefined' ? self : global");
|
|
|
| /** A stub for interacting with the main manager. */
|
| class _MainManagerStub {
|
| @@ -713,6 +723,7 @@ get globalWindow {
|
| get globalWorker {
|
| return JS('', "#.Worker", global);
|
| }
|
| +
|
| bool get globalPostMessageDefined {
|
| return JS('bool', "!!#.postMessage", global);
|
| }
|
| @@ -724,7 +735,6 @@ typedef _MainFunctionArgsMessage(args, message);
|
| /// Note: IsolateNatives depends on _globalState which is only set up correctly
|
| /// when 'dart:isolate' has been imported.
|
| class IsolateNatives {
|
| -
|
| // We set [enableSpawnWorker] to true (not null) when calling isolate
|
| // primitives that require support for spawning workers. The field starts out
|
| // by being null, and dart2js' type inference will track if it can have a
|
| @@ -773,10 +783,11 @@ class IsolateNatives {
|
| // According to Internet Explorer documentation, the stack
|
| // property is not set until the exception is thrown. The stack
|
| // property was not provided until IE10.
|
| - stack = JS('String|Null',
|
| - '(function() {'
|
| - 'try { throw new Error() } catch(e) { return e.stack }'
|
| - '})()');
|
| + stack = JS(
|
| + 'String|Null',
|
| + '(function() {'
|
| + 'try { throw new Error() } catch(e) { return e.stack }'
|
| + '})()');
|
| if (stack == null) throw new UnsupportedError('No stack trace');
|
| }
|
| var pattern, matches;
|
| @@ -785,9 +796,8 @@ class IsolateNatives {
|
| // traces that look like this:
|
| // Error
|
| // at methodName (URI:LINE:COLUMN)
|
| - pattern = JS('',
|
| - r'new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m")');
|
| -
|
| + pattern =
|
| + JS('', r'new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m")');
|
|
|
| matches = JS('JSExtendableArray|Null', '#.match(#)', stack, pattern);
|
| if (matches != null) return JS('String', '#[1]', matches);
|
| @@ -829,8 +839,8 @@ class IsolateNatives {
|
| var replyTo = _deserializeMessage(msg['replyTo']);
|
| var context = new _IsolateContext();
|
| _globalState.topEventLoop.enqueue(context, () {
|
| - _startIsolate(entryPoint, args, message,
|
| - isSpawnUri, startPaused, replyTo);
|
| + _startIsolate(
|
| + entryPoint, args, message, isSpawnUri, startPaused, replyTo);
|
| }, 'worker-start');
|
| // Make sure we always have a current context in this worker.
|
| // TODO(7907): This is currently needed because we're using
|
| @@ -862,8 +872,8 @@ class IsolateNatives {
|
| break;
|
| case 'print':
|
| if (_globalState.isWorker) {
|
| - _globalState.mainManager.postMessage(
|
| - _serializeMessage({'command': 'print', 'msg': msg}));
|
| + _globalState.mainManager
|
| + .postMessage(_serializeMessage({'command': 'print', 'msg': msg}));
|
| } else {
|
| print(msg['msg']);
|
| }
|
| @@ -875,9 +885,8 @@ class IsolateNatives {
|
|
|
| static handleSpawnWorkerRequest(msg) {
|
| var replyPort = msg['replyPort'];
|
| - spawn(msg['functionName'], msg['uri'],
|
| - msg['args'], msg['msg'],
|
| - false, msg['isSpawnUri'], msg['startPaused']).then((msg) {
|
| + spawn(msg['functionName'], msg['uri'], msg['args'], msg['msg'], false,
|
| + msg['isSpawnUri'], msg['startPaused']).then((msg) {
|
| replyPort.send(msg);
|
| }, onError: (String errorMessage) {
|
| replyPort.send([_SPAWN_FAILED_SIGNAL, errorMessage]);
|
| @@ -887,8 +896,8 @@ class IsolateNatives {
|
| /** Log a message, forwarding to the main [_Manager] if appropriate. */
|
| static _log(msg) {
|
| if (_globalState.isWorker) {
|
| - _globalState.mainManager.postMessage(
|
| - _serializeMessage({'command': 'log', 'msg': msg }));
|
| + _globalState.mainManager
|
| + .postMessage(_serializeMessage({'command': 'log', 'msg': msg}));
|
| } else {
|
| try {
|
| _consoleLog(msg);
|
| @@ -921,35 +930,32 @@ class IsolateNatives {
|
| return JS("", "new #()", ctor);
|
| }
|
|
|
| - static Future<List> spawnFunction(void topLevelFunction(message),
|
| - var message,
|
| - bool startPaused) {
|
| + static Future<List> spawnFunction(
|
| + void topLevelFunction(message), var message, bool startPaused) {
|
| IsolateNatives.enableSpawnWorker = true;
|
| final name = _getJSFunctionName(topLevelFunction);
|
| if (name == null) {
|
| - throw new UnsupportedError(
|
| - "only top-level functions can be spawned.");
|
| + throw new UnsupportedError("only top-level functions can be spawned.");
|
| }
|
| bool isLight = false;
|
| bool isSpawnUri = false;
|
| return spawn(name, null, null, message, isLight, isSpawnUri, startPaused);
|
| }
|
|
|
| - static Future<List> spawnUri(Uri uri, List<String> args, var message,
|
| - bool startPaused) {
|
| + static Future<List> spawnUri(
|
| + Uri uri, List<String> args, var message, bool startPaused) {
|
| IsolateNatives.enableSpawnWorker = true;
|
| bool isLight = false;
|
| bool isSpawnUri = true;
|
| - return spawn(null, uri.toString(), args, message,
|
| - isLight, isSpawnUri, startPaused);
|
| + return spawn(
|
| + null, uri.toString(), args, message, isLight, isSpawnUri, startPaused);
|
| }
|
|
|
| // TODO(sigmund): clean up above, after we make the new API the default:
|
|
|
| /// If [uri] is `null` it is replaced with the current script.
|
| - static Future<List> spawn(String functionName, String uri,
|
| - List<String> args, message,
|
| - bool isLight, bool isSpawnUri, bool startPaused) {
|
| + static Future<List> spawn(String functionName, String uri, List<String> args,
|
| + message, bool isLight, bool isSpawnUri, bool startPaused) {
|
| // Assume that the compiled version of the Dart file lives just next to the
|
| // dart file.
|
| // TODO(floitsch): support precompiled version of dart2js output.
|
| @@ -969,20 +975,20 @@ class IsolateNatives {
|
| SendPort signalReply = port.sendPort;
|
|
|
| if (_globalState.useWorkers && !isLight) {
|
| - _startWorker(
|
| - functionName, uri, args, message, isSpawnUri, startPaused,
|
| + _startWorker(functionName, uri, args, message, isSpawnUri, startPaused,
|
| signalReply, (String message) => completer.completeError(message));
|
| } else {
|
| - _startNonWorker(
|
| - functionName, uri, args, message, isSpawnUri, startPaused,
|
| + _startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused,
|
| signalReply);
|
| }
|
| return completer.future;
|
| }
|
|
|
| static void _startWorker(
|
| - String functionName, String uri,
|
| - List<String> args, message,
|
| + String functionName,
|
| + String uri,
|
| + List<String> args,
|
| + message,
|
| bool isSpawnUri,
|
| bool startPaused,
|
| SendPort replyPort,
|
| @@ -993,23 +999,26 @@ class IsolateNatives {
|
| if (args != null) args = new List<String>.from(args);
|
| if (_globalState.isWorker) {
|
| _globalState.mainManager.postMessage(_serializeMessage({
|
| - 'command': 'spawn-worker',
|
| - 'functionName': functionName,
|
| - 'args': args,
|
| - 'msg': message,
|
| - 'uri': uri,
|
| - 'isSpawnUri': isSpawnUri,
|
| - 'startPaused': startPaused,
|
| - 'replyPort': replyPort}));
|
| + 'command': 'spawn-worker',
|
| + 'functionName': functionName,
|
| + 'args': args,
|
| + 'msg': message,
|
| + 'uri': uri,
|
| + 'isSpawnUri': isSpawnUri,
|
| + 'startPaused': startPaused,
|
| + 'replyPort': replyPort
|
| + }));
|
| } else {
|
| - _spawnWorker(functionName, uri, args, message,
|
| - isSpawnUri, startPaused, replyPort, onError);
|
| + _spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused,
|
| + replyPort, onError);
|
| }
|
| }
|
|
|
| static void _startNonWorker(
|
| - String functionName, String uri,
|
| - List<String> args, var message,
|
| + String functionName,
|
| + String uri,
|
| + List<String> args,
|
| + var message,
|
| bool isSpawnUri,
|
| bool startPaused,
|
| SendPort replyPort) {
|
| @@ -1034,22 +1043,21 @@ class IsolateNatives {
|
| static Isolate get currentIsolate {
|
| _IsolateContext context = JS_CURRENT_ISOLATE_CONTEXT();
|
| return new Isolate(context.controlPort.sendPort,
|
| - pauseCapability: context.pauseCapability,
|
| - terminateCapability: context.terminateCapability);
|
| + pauseCapability: context.pauseCapability,
|
| + terminateCapability: context.terminateCapability);
|
| }
|
|
|
| - static void _startIsolate(Function topLevel,
|
| - List<String> args, message,
|
| - bool isSpawnUri,
|
| - bool startPaused,
|
| - SendPort replyTo) {
|
| + static void _startIsolate(Function topLevel, List<String> args, message,
|
| + bool isSpawnUri, bool startPaused, SendPort replyTo) {
|
| _IsolateContext context = JS_CURRENT_ISOLATE_CONTEXT();
|
| Primitives.initializeStatics(context.id);
|
| // The isolate's port does not keep the isolate open.
|
| - replyTo.send([_SPAWNED_SIGNAL,
|
| - context.controlPort.sendPort,
|
| - context.pauseCapability,
|
| - context.terminateCapability]);
|
| + replyTo.send([
|
| + _SPAWNED_SIGNAL,
|
| + context.controlPort.sendPort,
|
| + context.pauseCapability,
|
| + context.terminateCapability
|
| + ]);
|
|
|
| void runStartFunction() {
|
| context.initialized = true;
|
| @@ -1066,8 +1074,8 @@ class IsolateNatives {
|
|
|
| if (startPaused) {
|
| context.addPause(context.pauseCapability, context.pauseCapability);
|
| - _globalState.topEventLoop.enqueue(context, runStartFunction,
|
| - 'start isolate');
|
| + _globalState.topEventLoop
|
| + .enqueue(context, runStartFunction, 'start isolate');
|
| } else {
|
| runStartFunction();
|
| }
|
| @@ -1077,12 +1085,15 @@ class IsolateNatives {
|
| * Spawns an isolate in a worker. [factoryName] is the Javascript constructor
|
| * name for the isolate entry point class.
|
| */
|
| - static void _spawnWorker(functionName, String uri,
|
| - List<String> args, message,
|
| - bool isSpawnUri,
|
| - bool startPaused,
|
| - SendPort replyPort,
|
| - void onError(String message)) {
|
| + static void _spawnWorker(
|
| + functionName,
|
| + String uri,
|
| + List<String> args,
|
| + message,
|
| + bool isSpawnUri,
|
| + bool startPaused,
|
| + SendPort replyPort,
|
| + void onError(String message)) {
|
| if (uri == null) uri = thisScript;
|
| final worker = JS('var', 'new Worker(#)', uri);
|
| // Trampolines are used when wanting to call a Dart closure from
|
| @@ -1097,7 +1108,9 @@ class IsolateNatives {
|
| return f(e, u, c)
|
| }
|
| })(#, #, #)''',
|
| - workerOnError, uri, onError);
|
| + workerOnError,
|
| + uri,
|
| + onError);
|
| JS('void', '#.onerror = #', worker, onerrorTrampoline);
|
|
|
| var processWorkerMessageTrampoline = JS(
|
| @@ -1118,19 +1131,24 @@ class IsolateNatives {
|
| // We also store the id on the worker itself so that we can unregister it.
|
| workerIds[worker] = workerId;
|
| _globalState.managers[workerId] = worker;
|
| - JS('void', '#.postMessage(#)', worker, _serializeMessage({
|
| - 'command': 'start',
|
| - 'id': workerId,
|
| - // Note: we serialize replyPort twice because the child worker needs to
|
| - // first deserialize the worker id, before it can correctly deserialize
|
| - // the port (port deserialization is sensitive to what is the current
|
| - // workerId).
|
| - 'replyTo': _serializeMessage(replyPort),
|
| - 'args': args,
|
| - 'msg': _serializeMessage(message),
|
| - 'isSpawnUri': isSpawnUri,
|
| - 'startPaused': startPaused,
|
| - 'functionName': functionName }));
|
| + JS(
|
| + 'void',
|
| + '#.postMessage(#)',
|
| + worker,
|
| + _serializeMessage({
|
| + 'command': 'start',
|
| + 'id': workerId,
|
| + // Note: we serialize replyPort twice because the child worker needs to
|
| + // first deserialize the worker id, before it can correctly deserialize
|
| + // the port (port deserialization is sensitive to what is the current
|
| + // workerId).
|
| + 'replyTo': _serializeMessage(replyPort),
|
| + 'args': args,
|
| + 'msg': _serializeMessage(message),
|
| + 'isSpawnUri': isSpawnUri,
|
| + 'startPaused': startPaused,
|
| + 'functionName': functionName
|
| + }));
|
| }
|
|
|
| static bool workerOnError(
|
| @@ -1165,9 +1183,9 @@ abstract class _BaseSendPort implements SendPort {
|
| const _BaseSendPort(this._isolateId);
|
|
|
| void _checkReplyTo(SendPort replyTo) {
|
| - if (replyTo != null
|
| - && replyTo is! _NativeJsSendPort
|
| - && replyTo is! _WorkerSendPort) {
|
| + if (replyTo != null &&
|
| + replyTo is! _NativeJsSendPort &&
|
| + replyTo is! _WorkerSendPort) {
|
| throw new Exception("SendPort.send: Illegal replyTo port type");
|
| }
|
| }
|
| @@ -1202,8 +1220,8 @@ class _NativeJsSendPort extends _BaseSendPort implements SendPort {
|
| }, 'receive $message');
|
| }
|
|
|
| - bool operator ==(var other) => (other is _NativeJsSendPort) &&
|
| - (_receivePort == other._receivePort);
|
| + bool operator ==(var other) =>
|
| + (other is _NativeJsSendPort) && (_receivePort == other._receivePort);
|
|
|
| int get hashCode => _receivePort._id;
|
| }
|
| @@ -1218,10 +1236,8 @@ class _WorkerSendPort extends _BaseSendPort implements SendPort {
|
| : super(isolateId);
|
|
|
| void send(var message) {
|
| - final workerMessage = _serializeMessage({
|
| - 'command': 'message',
|
| - 'port': this,
|
| - 'msg': message});
|
| + final workerMessage =
|
| + _serializeMessage({'command': 'message', 'port': this, 'msg': message});
|
|
|
| if (_globalState.isWorker) {
|
| // Communication from one worker to another go through the
|
| @@ -1267,7 +1283,9 @@ class RawReceivePortImpl implements RawReceivePort {
|
| // Creates the control port of an isolate.
|
| // This is created before the isolate context object itself,
|
| // so it cannot access the static _nextFreeId field.
|
| - RawReceivePortImpl._controlPort() : _handler = null, _id = 0;
|
| + RawReceivePortImpl._controlPort()
|
| + : _handler = null,
|
| + _id = 0;
|
|
|
| void set handler(Function newHandler) {
|
| _handler = newHandler;
|
| @@ -1312,11 +1330,9 @@ class ReceivePortImpl extends Stream implements ReceivePort {
|
| }
|
|
|
| StreamSubscription listen(void onData(var event),
|
| - {Function onError,
|
| - void onDone(),
|
| - bool cancelOnError}) {
|
| - return _controller.stream.listen(onData, onError: onError, onDone: onDone,
|
| - cancelOnError: cancelOnError);
|
| + {Function onError, void onDone(), bool cancelOnError}) {
|
| + return _controller.stream.listen(onData,
|
| + onError: onError, onDone: onDone, cancelOnError: cancelOnError);
|
| }
|
|
|
| void close() {
|
| @@ -1332,10 +1348,8 @@ class TimerImpl implements Timer {
|
| bool _inEventLoop = false;
|
| int _handle;
|
|
|
| - TimerImpl(int milliseconds, void callback())
|
| - : _once = true {
|
| + TimerImpl(int milliseconds, void callback()) : _once = true {
|
| if (milliseconds == 0 && (!hasTimer() || _globalState.isWorker)) {
|
| -
|
| void internalCallback() {
|
| _handle = null;
|
| callback();
|
| @@ -1351,11 +1365,10 @@ class TimerImpl implements Timer {
|
| // TODO(7907): In case of web workers, we need to use the event
|
| // loop instead of setTimeout, to make sure the futures get executed in
|
| // order.
|
| - _globalState.topEventLoop.enqueue(
|
| - _globalState.currentContext, internalCallback, 'timer');
|
| + _globalState.topEventLoop
|
| + .enqueue(_globalState.currentContext, internalCallback, 'timer');
|
| _inEventLoop = true;
|
| } else if (hasTimer()) {
|
| -
|
| void internalCallback() {
|
| _handle = null;
|
| leaveJsAsync();
|
| @@ -1376,8 +1389,9 @@ class TimerImpl implements Timer {
|
| : _once = false {
|
| if (hasTimer()) {
|
| enterJsAsync();
|
| - _handle = JS('int', '#.setInterval(#, #)',
|
| - global, () { callback(this); }, milliseconds);
|
| + _handle = JS('int', '#.setInterval(#, #)', global, () {
|
| + callback(this);
|
| + }, milliseconds);
|
| } else {
|
| throw new UnsupportedError("Periodic timer.");
|
| }
|
| @@ -1408,7 +1422,6 @@ bool hasTimer() {
|
| return JS('', '#.setTimeout', global) != null;
|
| }
|
|
|
| -
|
| /**
|
| * Implementation class for [Capability].
|
| *
|
| @@ -1427,7 +1440,7 @@ class CapabilityImpl implements Capability {
|
| // http://www.concentric.net/~Ttwang/tech/inthash.htm
|
| // (via https://gist.github.com/badboy/6267743)
|
| int hash = _id;
|
| - hash = (hash >> 0) ^ (hash ~/ 0x100000000); // To 32 bit from ~64.
|
| + hash = (hash >> 0) ^ (hash ~/ 0x100000000); // To 32 bit from ~64.
|
| hash = (~hash + (hash << 15)) & 0xFFFFFFFF;
|
| hash ^= hash >> 12;
|
| hash = (hash * 5) & 0xFFFFFFFF;
|
| @@ -1437,7 +1450,7 @@ class CapabilityImpl implements Capability {
|
| return hash;
|
| }
|
|
|
| - bool operator==(Object other) {
|
| + bool operator ==(Object other) {
|
| if (identical(other, this)) return true;
|
| if (other is CapabilityImpl) {
|
| return identical(_id, other._id);
|
|
|