Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(781)

Unified Diff: sdk/lib/js/dart2js/js_dart2js.dart

Issue 26092003: Maintain referential integrity of proxy instances in dart:js (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}
}

Powered by Google App Engine
This is Rietveld 408576698