Index: tool/input_sdk/private/ddc_runtime/rtti.dart |
diff --git a/tool/input_sdk/private/ddc_runtime/rtti.dart b/tool/input_sdk/private/ddc_runtime/rtti.dart |
index da6bad9e99e2a95c4795dec6563a884a09cb266e..37f12610f2e4636c8be0152416d388b83f120f55 100644 |
--- a/tool/input_sdk/private/ddc_runtime/rtti.dart |
+++ b/tool/input_sdk/private/ddc_runtime/rtti.dart |
@@ -60,8 +60,8 @@ fn(closure, rType, argsT, extras) { |
if (rType == null) { |
// No type arguments, it's all dynamic |
t = definiteFunctionType( |
- dynamicR, |
- JS('', 'Array(#.length).fill(#)', closure, dynamicR), |
+ JS('', '#', dynamic), |
+ JS('', 'Array(#.length).fill(#)', closure, dynamic), |
JS('', 'void 0')); |
} else { |
// We're passed the piecewise components of the function type, |
@@ -83,42 +83,31 @@ lazyFn(closure, computeTypeParts) { |
// TODO(vsm): How should we encode the runtime type? |
final _runtimeType = JS('', 'Symbol("_runtimeType")'); |
-checkPrimitiveType(obj) => JS('', '''(() => { |
- switch (typeof $obj) { |
- case "undefined": |
- return $Null; |
+_checkPrimitiveType(obj) { |
+ // TODO(jmesserly): JS is used to prevent type literal wrapping. |
+ // Is there a better way we can handle this? |
+ |
+ // Check for null and undefined |
+ if (obj == null) return JS('', '#', Null); |
+ switch (JS('String', 'typeof #', obj)) { |
case "number": |
- return Math.floor($obj) == $obj ? $int : $double; |
+ return JS('bool', 'Math.floor(#) == # ? # : #', obj, obj, int, double); |
case "boolean": |
- return $bool; |
+ return JS('', '#', bool); |
case "string": |
- return $String; |
+ return JS('', '#', String); |
case "symbol": |
- return Symbol; |
+ // Note: this is a JS Symbol, not a Dart one. |
+ return JS('', '#', jsobject); |
} |
- // Undefined is handled above. For historical reasons, |
- // typeof null == "object" in JS. |
- if ($obj === null) return $Null; |
return null; |
-})()'''); |
- |
-runtimeType(obj) => JS('', '''(() => { |
- // Handle primitives where the method isn't on the object. |
- let result = $checkPrimitiveType($obj); |
- if (result !== null) return $wrapType(result); |
- |
- // Delegate to the actual method on the object. |
- return $obj.runtimeType; |
-})()'''); |
+} |
-getFunctionType(obj) => JS('', '''(() => { |
+getFunctionType(obj) { |
// TODO(vsm): Encode this properly on the function for Dart-generated code. |
- let args = Array($obj.length).fill($dynamicR); |
- return $definiteFunctionType($bottom, args); |
-})()'''); |
- |
-/// The base implementation of Object.runtimeType. |
-objectRuntimeType(obj) => wrapType(getReifiedType(obj)); |
+ var args = JS('', 'Array(#.length).fill(#)', obj, dynamic); |
+ return definiteFunctionType(bottom, args, JS('', 'void 0')); |
+} |
/// Returns an the runtime representation of the type of obj. |
/// |
@@ -126,31 +115,31 @@ objectRuntimeType(obj) => wrapType(getReifiedType(obj)); |
/// different from the user-visible Type object returned by calling |
/// `runtimeType` on some Dart object. |
getReifiedType(obj) { |
- var result = checkPrimitiveType(obj); |
+ var result = _checkPrimitiveType(obj); |
if (result != null) return result; |
return _nonPrimitiveRuntimeType(obj); |
} |
-_nonPrimitiveRuntimeType(obj) => JS('', '''(() => { |
+_nonPrimitiveRuntimeType(obj) { |
// Lookup recorded *real* type (not user definable runtimeType) |
// TODO(vsm): Should we treat Dart and JS objects differently here? |
// E.g., we can check if obj instanceof core.Object to differentiate. |
- let result = $obj[$_runtimeType]; |
- if (result) return result; |
+ var result = _getRuntimeType(obj); |
+ if (result != null) return result; |
// Lookup extension type |
- result = $obj[$_extensionType]; |
- if (result) return result; |
+ result = getExtensionType(obj); |
+ if (result != null) return result; |
// Fallback on constructor for class types |
- result = $obj.constructor; |
- if (result == Function) { |
- // An undecorated Function should have come from |
- // JavaScript. Treat as untyped. |
- return $jsobject; |
+ result = JS('', '#.constructor', obj); |
+ if (JS('bool', '# === Function', result)) { |
+ // An undecorated Function should have come from JavaScript. |
+ // Treat as untyped. |
+ return JS('', '#', jsobject); |
} |
return result; |
-})()'''); |
+} |
/// Given an internal runtime type object, wraps it in a `WrappedType` object |
/// that implements the dart:core Type interface. |