| 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
 | 
| 
 |