| Index: lib/html/dartium/html_dartium.dart
|
| diff --git a/lib/html/dartium/html_dartium.dart b/lib/html/dartium/html_dartium.dart
|
| index d0e39b4525eabcf13850f2e37a3e2bb215586db6..7efaff1e667364efcdbef4a0bbf866e78238455c 100644
|
| --- a/lib/html/dartium/html_dartium.dart
|
| +++ b/lib/html/dartium/html_dartium.dart
|
| @@ -40763,6 +40763,12 @@ class _JsSerializer extends _Serializer {
|
| x._receivePort._isolateId, x._receivePort._portId ];
|
| }
|
|
|
| + visitObject(Object x) {
|
| + if (x is Function) return visitFunction(x);
|
| + // TODO: Handle DOM elements and proxy other objects.
|
| + throw "Unserializable object $x";
|
| + }
|
| +
|
| visitFunction(Function func) {
|
| return [ 'funcref',
|
| _makeFunctionRef(func), visitSendPortSync(_sendPort()), null ];
|
| @@ -40821,6 +40827,8 @@ _deserialize(var message) {
|
|
|
| class _JsDeserializer extends _Deserializer {
|
|
|
| + static final _UNSPECIFIED = const Object();
|
| +
|
| deserializeSendPort(List x) {
|
| String tag = x[1];
|
| switch (tag) {
|
| @@ -40836,6 +40844,27 @@ class _JsDeserializer extends _Deserializer {
|
| }
|
| }
|
|
|
| + deserializeObject(List x) {
|
| + String tag = x[0];
|
| + switch (tag) {
|
| + case 'funcref': return deserializeFunction(x);
|
| + default: throw 'Illegal object type: $x';
|
| + }
|
| + }
|
| +
|
| + deserializeFunction(List x) {
|
| + var id = x[1];
|
| + SendPortSync port = deserializeSendPort(x[2]);
|
| + // TODO: Support varargs when there is support in the language.
|
| + return ([arg0 = _UNSPECIFIED, arg1 = _UNSPECIFIED,
|
| + arg2 = _UNSPECIFIED, arg3 = _UNSPECIFIED]) {
|
| + var args = [arg0, arg1, arg2, arg3];
|
| + var last = args.indexOf(_UNSPECIFIED);
|
| + if (last >= 0) args = args.getRange(0, last);
|
| + var message = [id, args];
|
| + return port.callSync(message);
|
| + };
|
| + }
|
| }
|
|
|
| // The receiver is JS.
|
| @@ -41276,10 +41305,9 @@ class _MessageTraverser {
|
| if (x is Map) return visitMap(x);
|
| if (x is SendPort) return visitSendPort(x);
|
| if (x is SendPortSync) return visitSendPortSync(x);
|
| - if (x is Function) return visitFunction(x);
|
|
|
| - // TODO(floitsch): make this a real exception. (which one)?
|
| - throw "Message serialization: Illegal value $x passed";
|
| + // Overridable fallback.
|
| + return visitObject(x);
|
| }
|
|
|
| abstract visitPrimitive(x);
|
| @@ -41288,8 +41316,9 @@ class _MessageTraverser {
|
| abstract visitSendPort(SendPort x);
|
| abstract visitSendPortSync(SendPortSync x);
|
|
|
| - visitFunction(Function func) {
|
| - throw "Serialization of functions is not allowed.";
|
| + visitObject(Object x) {
|
| + // TODO(floitsch): make this a real exception. (which one)?
|
| + throw "Message serialization: Illegal value $x passed";
|
| }
|
|
|
| static bool isPrimitive(x) {
|
| @@ -41397,8 +41426,7 @@ class _Deserializer {
|
| case 'list': return _deserializeList(x);
|
| case 'map': return _deserializeMap(x);
|
| case 'sendport': return deserializeSendPort(x);
|
| - // TODO(floitsch): Use real exception (which one?).
|
| - default: throw "Unexpected serialized object";
|
| + default: return deserializeObject(x);
|
| }
|
| }
|
|
|
| @@ -41439,6 +41467,10 @@ class _Deserializer {
|
|
|
| abstract deserializeSendPort(List x);
|
|
|
| + deserializeObject(List x) {
|
| + // TODO(floitsch): Use real exception (which one?).
|
| + throw "Unexpected serialized object";
|
| + }
|
| }
|
| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| // for details. All rights reserved. Use of this source code is governed by a
|
|
|