Index: dart/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart b/dart/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart |
index cf639f272800d376d8128b0cef508417a815e84a..d9999e738c4483b180895dc3743641436b6ebf8e 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart |
@@ -409,21 +409,6 @@ class _MainManagerStub implements _ManagerStub { |
void terminate() {} // Nothing useful to do here. |
} |
-/** |
- * A stub for interacting with a manager built on a web worker. This |
- * definition uses a 'hidden' type (* prefix on the native name) to |
- * enforce that the type is defined dynamically only when web workers |
- * are actually available. |
- */ |
-// @Native("*Worker"); |
-class _WorkerStub implements _ManagerStub { |
- get id => JS("", "#.id", this); |
- void set id(i) { JS("void", "#.id = #", this, i); } |
- void set onmessage(f) { JS("void", "#.onmessage = #", this, f); } |
- void postMessage(msg) { JS("void", "#.postMessage(#)", this, msg); } |
- void terminate() { JS("void", "#.terminate()", this); } |
-} |
- |
const String _SPAWNED_SIGNAL = "spawned"; |
var globalThis = IsolateNatives.computeGlobalThis(); |
@@ -485,9 +470,6 @@ class IsolateNatives { |
static computeGlobalThis() => JS('', 'function() { return this; }()'); |
- /** Starts a new worker with the given URL. */ |
- static _WorkerStub _newWorker(url) => JS("_WorkerStub", r"new Worker(#)", url); |
- |
/** |
* Assume that [e] is a browser message event and extract its message data. |
* We don't import the dom explicitly so, when workers are disabled, this |
@@ -532,8 +514,8 @@ class IsolateNatives { |
break; |
case 'close': |
_log("Closing Worker"); |
- _globalState.managers.remove(sender.id); |
- sender.terminate(); |
+ _globalState.managers.remove(getId(sender)); |
+ doTerminate(sender); |
_globalState.topEventLoop.run(); |
break; |
case 'log': |
@@ -552,6 +534,22 @@ class IsolateNatives { |
} |
} |
+ |
+ static getId(/* Worker or _ManagerStub */ worker) { |
+ if (worker is _ManagerStub) return worker.id; |
+ return JS('', '#.id', worker); |
+ } |
+ |
+ static doTerminate(/* Worker or _ManagerStub */ worker) { |
+ if (worker is _ManagerStub) return worker.terminate(); |
+ return JS('', '#.terminate()', worker); |
+ } |
+ |
+ static doPostMessage(/* Worker or _ManagerStub */ worker, message) { |
+ if (worker is _ManagerStub) return worker.postMessage(message); |
+ return JS('', '#.postMessage(#)', worker, message); |
+ } |
+ |
/** Log a message, forwarding to the main [_Manager] if appropriate. */ |
static _log(msg) { |
if (_globalState.isWorker) { |
@@ -670,24 +668,26 @@ class IsolateNatives { |
static void _spawnWorker(functionName, uri, replyPort) { |
if (functionName == null) functionName = 'main'; |
if (uri == null) uri = thisScript; |
- final worker = _newWorker(uri); |
- worker.onmessage = JS('', |
- 'function(e) { #(#, e); }', |
- DART_CLOSURE_TO_JS(_processWorkerMessage), |
- worker); |
+ final worker = JS('var', 'new Worker(#)', uri); |
+ |
+ var processWorkerMessageTrampoline = |
+ JS('', 'function(e) { #(#, e); }', |
+ DART_CLOSURE_TO_JS(_processWorkerMessage), |
+ worker); |
+ JS('void', '#.onmessage = #', worker, processWorkerMessageTrampoline); |
var workerId = _globalState.nextManagerId++; |
// We also store the id on the worker itself so that we can unregister it. |
- worker.id = workerId; |
+ JS('void', '#.id = #', worker, workerId); |
_globalState.managers[workerId] = worker; |
- worker.postMessage(_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), |
- '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), |
+ 'functionName': functionName })); |
} |
} |
@@ -804,7 +804,7 @@ class _WorkerSendPort extends _BaseSendPort implements SendPort { |
// Deliver the message only if the worker is still alive. |
_ManagerStub manager = _globalState.managers[_workerId]; |
if (manager != null) { |
- manager.postMessage(workerMessage); |
+ IsolateNatives.doPostMessage(manager, workerMessage); |
} |
} |
}); |