| Index: client/dart.js
|
| diff --git a/client/dart.js b/client/dart.js
|
| index dae0d2b61482a36eab12c9112a360af5b25a45c9..711aeee5702478258e964aad47a196e109154701 100644
|
| --- a/client/dart.js
|
| +++ b/client/dart.js
|
| @@ -46,6 +46,33 @@ function ReceivePortSync() {
|
| }
|
|
|
| (function() {
|
| + // Track proxied functions.
|
| + // TODO: Fix leaks, particularly in dart2js case.
|
| + var functionRefMap = {};
|
| +
|
| + var nextFunctionRefId = 0;
|
| +
|
| + function functionRefDispatch(message) {
|
| + var id = message[0];
|
| + var args = message[1];
|
| + var f = functionRefMap[id];
|
| + // TODO: Should we capture this automatically?
|
| + return f.apply(null, args);
|
| + }
|
| +
|
| + var functionRefPort = null;
|
| +
|
| + function makeFunctionRef(f) {
|
| + if (functionRefPort == null) {
|
| + var port = new ReceivePortSync();
|
| + port.receive(functionRefDispatch);
|
| + functionRefPort = port.toSendPort();
|
| + }
|
| + var ref = 'func-ref-' + (nextFunctionRefId++);
|
| + functionRefMap[ref] = f;
|
| + return ref;
|
| + }
|
| +
|
| function serialize(message) {
|
| var visited = [];
|
| function checkedSerialization(obj, serializer) {
|
| @@ -79,6 +106,9 @@ function ReceivePortSync() {
|
| return [ 'sendport', 'nativejs', message.receivePort.id ];
|
| } else if (message instanceof DartSendPortSync) {
|
| return [ 'sendport', 'dart', message.isolateId, message.portId ];
|
| + } else if (message instanceof Function) {
|
| + return [ 'funcref', makeFunctionRef(message),
|
| + doSerialize(functionRefPort) ];
|
| } else {
|
| return checkedSerialization(message, function(id) {
|
| var keys = Object.getOwnPropertyNames(message);
|
|
|