Chromium Code Reviews| 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 521716bdf06a9820bdcfe7f0d26c0d3220f61c94..616f5251f59566d8071d5dc3e5272bb9545dcf07 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 |
| @@ -75,39 +75,6 @@ final _runtimeType = JS('', 'Symbol("_runtimeType")'); |
| final _moduleName = JS('', 'Symbol("_moduleName")'); |
| -_checkPrimitiveType(obj) { |
| - // TODO(jmesserly): JS is used to prevent type literal wrapping. Is there a |
| - // better way we can handle this? (sra: It is super dodgy that the values |
| - // passed to JS are different to the values passed to a regular function - the |
| - // semantics are not longer that of calling an interpreter. dart2js has other |
| - // special functions, we could do the same.) |
| - |
| - // Check for null and undefined |
| - if (obj == null) return JS('', '#', Null); |
| - |
| - if (JS('bool', 'typeof # == "number"', obj)) { |
| - if (JS('bool', 'Math.floor(#) == #', obj, obj)) { |
| - return JS('', '#', int); |
| - } |
| - return JS('', '#', double); |
| - } |
| - |
| - if (JS('bool', 'typeof # == "boolean"', obj)) { |
| - return JS('', '#', bool); |
| - } |
| - |
| - if (JS('bool', 'typeof # == "string"', obj)) { |
| - return JS('', '#', String); |
| - } |
| - |
| - if (JS('bool', 'typeof # == "symbol"', obj)) { |
| - // Note: this is a JS Symbol, not a Dart one. |
| - return JS('', '#', jsobject); |
| - } |
| - |
| - return null; |
| -} |
| - |
| getFunctionType(obj) { |
| // TODO(vsm): Encode this properly on the function for Dart-generated code. |
| var args = JS('List', 'Array(#.length).fill(#)', obj, dynamic); |
| @@ -120,34 +87,32 @@ getFunctionType(obj) { |
| /// different from the user-visible Type object returned by calling |
| /// `runtimeType` on some Dart object. |
| getReifiedType(obj) { |
| - var result = _checkPrimitiveType(obj); |
| - if (result != null) return result; |
| - return _nonPrimitiveRuntimeType(obj); |
| -} |
| - |
| -/// Assumes that obj is non-null |
| -_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. |
| - var result = _getRuntimeType(obj); |
| - if (result != null) return result; |
| - |
| - // Lookup extension type |
| - result = getExtensionType(obj); |
| - if (result != null) return result; |
| - |
| - // Fallback on constructor for class types |
| - result = JS('', '#.constructor', obj); |
| - if (JS('bool', '# === Function', result)) { |
| - // An undecorated Function should have come from JavaScript. |
| - // Treat as untyped. |
| - return JS('', '#', jsobject); |
| - } |
| - if (result == null) { |
| - return JS('', '#', jsobject); |
| + switch (JS('String', 'typeof #', obj)) { |
|
Leaf
2017/08/24 17:19:39
Will V8 make this code fast, even when the `typeof
Jennifer Messerly
2017/08/24 18:26:37
Yup. I was skeptical too, but this code was the re
|
| + case "object": |
| + if (obj == null) return JS('', '#', Null); |
| + if (JS('bool', '# instanceof #', obj, Object)) { |
| + return JS('', '#.constructor', obj); |
| + } |
| + var result = JS('', '#[#]', obj, _extensionType); |
| + if (result == null) return JS('', '#', jsobject); |
|
Jennifer Messerly
2017/08/23 23:36:01
FYI -- there's one subtle difference from the old
Leaf
2017/08/24 17:19:39
Acknowledged.
|
| + return result; |
| + case "function": |
| + // All Dart functions and callable classes must set _runtimeType |
| + var result = JS('', '#[#]', obj, _runtimeType); |
| + if (result != null) return result; |
| + return JS('', '#', jsobject); |
| + case "undefined": |
| + return JS('', '#', Null); |
| + case "number": |
| + return JS('', 'Math.floor(#) == # ? # : #', obj, obj, int, double); |
| + case "boolean": |
| + return JS('', '#', bool); |
| + case "string": |
| + return JS('', '#', String); |
| + case "symbol": |
| + default: |
| + return JS('', '#', jsobject); |
| } |
| - return result; |
| } |
| /// Given an internal runtime type object, wraps it in a `WrappedType` object |