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

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

Issue 1962823002: fix #552, Object members on native types (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 7 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
« no previous file with comments | « tool/input_sdk/private/ddc_runtime/operations.dart ('k') | tool/input_sdk/private/ddc_runtime/types.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « tool/input_sdk/private/ddc_runtime/operations.dart ('k') | tool/input_sdk/private/ddc_runtime/types.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698