Index: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
index 6bef0d699f3413ba4194c93dc0746f471b210e65..51a703efdab460c4e319eecf19905c70a70b809c 100644 |
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
@@ -145,12 +145,30 @@ getGenericClass(type) => |
getGenericArgs(type) => JS('', '$safeGetOwnProperty($type, $_typeArguments)'); |
+// TODO(vsm): Collapse into one expando. |
final _constructorSig = JS('', 'Symbol("sigCtor")'); |
-final _methodSig = JS('', 'Symbol("sig")'); |
-final _staticSig = JS('', 'Symbol("sigStatic")'); |
+final _methodSig = JS('', 'Symbol("sigMethod")'); |
+final _fieldSig = JS('', 'Symbol("sigField")'); |
+final _getterSig= JS('', 'Symbol("sigGetter")'); |
+final _setterSig= JS('', 'Symbol("sigSetter")'); |
+final _staticSig = JS('', 'Symbol("sigStaticMethod")'); |
+final _staticFieldSig = JS('', 'Symbol("sigStaticField")'); |
+final _staticGetterSig= JS('', 'Symbol("sigStaticGetter")'); |
+final _staticSetterSig= JS('', 'Symbol("sigStaticSetter")'); |
final _genericTypeCtor = JS('', 'Symbol("genericType")'); |
+// TODO(vsm): Collapse this as well - just provide a dart map to mirrors code. |
+// These are queried by mirrors code. |
+getConstructorSig(value) => JS('', '#[#]', value, _constructorSig); |
getMethodSig(value) => JS('', '#[#]', value, _methodSig); |
+getFieldSig(value) => JS('', '#[#]', value, _fieldSig); |
+getGetterSig(value) => JS('', '#[#]', value, _getterSig); |
+getSetterSig(value) => JS('', '#[#]', value, _setterSig); |
+getStaticSig(value) => JS('', '#[#]', value, _staticSig); |
+getStaticFieldSig(value) => JS('', '#[#]', value, _staticFieldSig); |
+getStaticGetterSig(value) => JS('', '#[#]', value, _staticGetterSig); |
+getStaticSetterSig(value) => JS('', '#[#]', value, _staticSetterSig); |
+ |
getGenericTypeCtor(value) => JS('', '#[#]', value, _genericTypeCtor); |
/// Get the type of a method from an object using the stored signature |
@@ -176,7 +194,7 @@ getMethodTypeFromType(type, name) => JS( |
classGetConstructorType(cls, name) => JS( |
'', |
'''(() => { |
- if(!$name) $name = $cls.name; |
+ if(!$name) $name = 'new'; |
if ($cls === void 0) return void 0; |
if ($cls == null) return void 0; |
let sigCtor = $cls[$_constructorSig]; |
@@ -217,16 +235,21 @@ gbind(f, @rest typeArgs) { |
} |
// Set up the method signature field on the constructor |
-_setMethodSignature(f, sigF) => JS( |
+_setInstanceSignature(f, sigF, kind) => JS( |
'', |
'''(() => { |
- $defineMemoizedGetter($f, $_methodSig, () => { |
+ $defineMemoizedGetter($f, $kind, () => { |
let sigObj = $sigF(); |
- sigObj.__proto__ = $f.__proto__[$_methodSig]; |
+ sigObj.__proto__ = $f.__proto__[$kind]; |
return sigObj; |
}); |
})()'''); |
+_setMethodSignature(f, sigF) => _setInstanceSignature(f, sigF, _methodSig); |
+_setFieldSignature(f, sigF) => _setInstanceSignature(f, sigF, _fieldSig); |
+_setGetterSignature(f, sigF) => _setInstanceSignature(f, sigF, _getterSig); |
+_setSetterSignature(f, sigF) => _setInstanceSignature(f, sigF, _setterSig); |
+ |
// Set up the constructor signature field on the constructor |
_setConstructorSignature(f, sigF) => |
JS('', '$defineMemoizedGetter($f, $_constructorSig, $sigF)'); |
@@ -235,6 +258,15 @@ _setConstructorSignature(f, sigF) => |
_setStaticSignature(f, sigF) => |
JS('', '$defineMemoizedGetter($f, $_staticSig, $sigF)'); |
+_setStaticFieldSignature(f, sigF) => |
+ JS('', '$defineMemoizedGetter($f, $_staticFieldSig, $sigF)'); |
+ |
+_setStaticGetterSignature(f, sigF) => |
+ JS('', '$defineMemoizedGetter($f, $_staticGetterSig, $sigF)'); |
+ |
+_setStaticSetterSignature(f, sigF) => |
+ JS('', '$defineMemoizedGetter($f, $_staticSetterSig, $sigF)'); |
+ |
// Set the lazily computed runtime type field on static methods |
_setStaticTypes(f, names) => JS( |
'', |
@@ -258,6 +290,8 @@ _setStaticTypes(f, names) => JS( |
/// names: An array of the names of the static methods. Used to |
/// permit eagerly setting the runtimeType field on the methods |
/// while still lazily computing the type descriptor object. |
+/// fields: A function returning an object mapping instance field |
+/// names to types. |
setSignature(f, signature) => JS( |
'', |
'''(() => { |
@@ -266,13 +300,31 @@ setSignature(f, signature) => JS( |
('constructors' in signature) ? signature.constructors : () => ({}); |
let methods = |
('methods' in signature) ? signature.methods : () => ({}); |
+ let fields = |
+ ('fields' in signature) ? signature.fields : () => ({}); |
+ let getters = |
+ ('getters' in signature) ? signature.getters : () => ({}); |
+ let setters = |
+ ('setters' in signature) ? signature.setters : () => ({}); |
let statics = |
('statics' in signature) ? signature.statics : () => ({}); |
+ let staticFields = |
+ ('sfields' in signature) ? signature.sfields : () => ({}); |
+ let staticGetters = |
+ ('sgetters' in signature) ? signature.sgetters : () => ({}); |
+ let staticSetters = |
+ ('ssetters' in signature) ? signature.ssetters : () => ({}); |
let names = |
('names' in signature) ? signature.names : []; |
$_setConstructorSignature($f, constructors); |
$_setMethodSignature($f, methods); |
+ $_setFieldSignature($f, fields); |
+ $_setGetterSignature($f, getters); |
+ $_setSetterSignature($f, setters); |
$_setStaticSignature($f, statics); |
+ $_setStaticFieldSignature($f, staticFields); |
+ $_setStaticGetterSignature($f, staticGetters); |
+ $_setStaticSetterSignature($f, staticSetters); |
$_setStaticTypes($f, names); |
})()'''); |