Chromium Code Reviews| Index: sdk/lib/js/dart2js/js_dart2js.dart |
| diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart |
| index 64b4af0b4771972ac4ac9b773480ece956d914b8..439c1d80f5c5723cb055581b14164f5c11a556b4 100644 |
| --- a/sdk/lib/js/dart2js/js_dart2js.dart |
| +++ b/sdk/lib/js/dart2js/js_dart2js.dart |
| @@ -166,6 +166,14 @@ abstract class Serializable<T> { |
| T toJs(); |
| } |
| +// property added to a Dart object referencing its JS-side DartObject proxy |
| +const _DART_OBJECT_PROPERTY_NAME = r'_$dart_dartObject'; |
|
justinfagnani
2013/10/06 00:37:45
Peter, how do I generate a unique name per-isolate
|
| +const _DART_CLOSURE_PROPERTY_NAME = r'_$dart_dartClosure'; |
| + |
| +// property added to a JS object referencing its Dart-side JsObject proxy |
| +const _JS_OBJECT_PROPERTY_NAME = r'_$dart_jsObject'; |
| +const _JS_FUNCTION_PROPERTY_NAME = r'$dart_jsFunction'; |
| + |
| dynamic _convertToJS(dynamic o) { |
| if (o == null) { |
| return null; |
| @@ -178,10 +186,12 @@ dynamic _convertToJS(dynamic o) { |
| } else if (o is Function) { |
| return _convertToJS(new Callback(o)); |
| } else { |
| - return JS('=Object', 'new DartProxy(#)', o); |
| + return JS('=Object', 'new DartObject(#)', o); |
| } |
| } |
| +// converts a Dart object to a reference to a native JS object |
| +// which might be a DartObject JS->Dart proxy |
| dynamic _convertToDart(dynamic o) { |
| if (JS('bool', '# == null', o)) { |
| return null; |
| @@ -190,10 +200,24 @@ dynamic _convertToDart(dynamic o) { |
| JS('bool', 'typeof # == "boolean" || # instanceof Boolean', o, o)) { |
| return o; |
| } else if (JS('bool', '# instanceof Function', o)) { |
| - return new JsFunction._fromJs(JS('=Object', '#', o)); |
| - } else if (JS('bool', '# instanceof DartProxy', o)) { |
| + var dartClosure = JS('', '#[#]', o, _DART_CLOSURE_PROPERTY_NAME); |
|
alexandre.ardhuin
2013/10/07 08:56:54
Extract a method for this case and default case ?
justinfagnani
2013/10/07 17:49:13
Good idea. Done.
|
| + if (dartClosure == null) { |
| + dartClosure = new JsFunction._fromJs(o); |
| + JS('void', 'Object.defineProperty(#, #, { value: #})', o, |
| + _DART_CLOSURE_PROPERTY_NAME, dartClosure); |
| + } |
| + return dartClosure; |
| + } else if (JS('bool', '# instanceof DartObject', o)) { |
| return JS('var', '#.o', o); |
| } else { |
| - return new JsObject._fromJs(JS('=Object', '#', o)); |
| + var dartProxy = JS('', '#[#]', o, _JS_OBJECT_PROPERTY_NAME); |
| + if (dartProxy == null) { |
| + // check the registered proxy factories to see if we should instanciate |
| + // a typed interface |
| + dartProxy = new JsObject._fromJs(JS('=Object', '#', o)); |
|
alexandre.ardhuin
2013/10/07 08:56:54
I don't remember why we used `JS('=Object', '#', o
justinfagnani
2013/10/07 17:49:13
Peter can shed light here, but I've seen similar t
|
| + JS('void', 'Object.defineProperty(#, #, { value: #})', o, |
| + _JS_OBJECT_PROPERTY_NAME, dartProxy); |
| + } |
| + return dartProxy; |
| } |
| } |