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

Unified Diff: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart

Issue 2515353003: Support lazy JS types. (Closed)
Patch Set: Support lazy JS types. Created 4 years, 1 month 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: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
index c6419a00ec5a6d978879a9d314713dd574d53a83..d97b6bd30acd2b855628a83752a4499c9e7c173a 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
@@ -58,10 +58,8 @@ part of dart._runtime;
fn(closure, t) {
if (t == null) {
// No type arguments, it's all dynamic
- t = definiteFunctionType(
- JS('', '#', dynamic),
- JS('', 'Array(#.length).fill(#)', closure, dynamic),
- JS('', 'void 0'));
+ t = definiteFunctionType(JS('', '#', dynamic),
+ JS('', 'Array(#.length).fill(#)', closure, dynamic), JS('', 'void 0'));
}
tag(closure, t);
return closure;
@@ -161,6 +159,29 @@ wrapType(type) {
return JS('', '#[#] = new #(#)', type, _typeObject, WrappedType, type);
}
+var _lazyJSTypes = JS('', 'new Map()');
+
+lazyJSType(getJSTypeCallback, name) {
+ var key = JS('String', '#.toString()', getJSTypeCallback);
+ if (JS('bool', '#.has(#)', _lazyJSTypes, key)) {
+ return JS('', '#.get(#)', _lazyJSTypes, key);
+ }
+ var ret = JS('', 'new #(#, #)', LazyJSType, getJSTypeCallback, name);
+ JS('', '#.set(#, #)', _lazyJSTypes, key, ret);
+ return ret;
+}
+
+// TODO(jacobr): do not use the same LazyJSType object for anonymous JS types
+// from different libraries.
+lazyAnonymousJSType(name) {
+ if (JS('bool', '#.has(#)', _lazyJSTypes, name)) {
+ return JS('', '#.get(#)', _lazyJSTypes, name);
+ }
+ var ret = JS('', 'new #(null, #)', LazyJSType, name);
+ JS('', '#.set(#, #)', _lazyJSTypes, name, ret);
+ return ret;
+}
+
/// Given a WrappedType, return the internal runtime type object.
unwrapType(obj) => obj._wrappedType;
@@ -180,6 +201,6 @@ void tagComputed(value, compute) {
}
void tagLazy(value, compute) {
- JS('', '#(#, #, { get: # })',
- defineLazyProperty, value, _runtimeType, compute);
+ JS('', '#(#, #, { get: # })', defineLazyProperty, value, _runtimeType,
+ compute);
}

Powered by Google App Engine
This is Rietveld 408576698