Index: tool/input_sdk/private/ddc_runtime/operations.dart |
diff --git a/tool/input_sdk/private/ddc_runtime/operations.dart b/tool/input_sdk/private/ddc_runtime/operations.dart |
index dcf385485b2c6dbd08d11071679ff401c1c3fee2..9f4891f4158adf4e6562d5a6907fb0245a4484bc 100644 |
--- a/tool/input_sdk/private/ddc_runtime/operations.dart |
+++ b/tool/input_sdk/private/ddc_runtime/operations.dart |
@@ -121,7 +121,7 @@ _checkAndCall(f, ftype, obj, typeArgs, args, name) => JS('', '''(() => { |
let formalCount = $ftype[$_typeFormalCount]; |
if (formalCount != null) { |
if ($typeArgs == null) { |
- $typeArgs = Array(formalCount).fill($dynamicR); |
+ $typeArgs = Array(formalCount).fill($dynamic); |
} else if ($typeArgs.length != formalCount) { |
// TODO(jmesserly): is this the right error? |
$throwStrongModeError( |
@@ -290,10 +290,10 @@ equals(x, y) => JS('', '''(() => { |
})()'''); |
/// Checks that `x` is not null or undefined. */ |
-notNull(x) => JS('', '''(() => { |
- if ($x == null) $throwNullValueError(); |
- return $x; |
-})()'''); |
+notNull(x) { |
+ if (x == null) throwNullValueError(); |
+ return x; |
+} |
/// |
/// Creates a dart:collection LinkedHashMap. |
@@ -312,8 +312,8 @@ notNull(x) => JS('', '''(() => { |
// TODO(jmesserly): we can use default values `= dynamic` once #417 is fixed. |
// TODO(jmesserly): move this to classes for consistentcy with list literals? |
map(values, [K, V]) => JS('', '''(() => { |
- if ($K == null) $K = $dynamicR; |
- if ($V == null) $V = $dynamicR; |
+ if ($K == null) $K = $dynamic; |
+ if ($V == null) $V = $dynamic; |
let map = ${getGenericClass(LinkedHashMap)}($K, $V).new(); |
if (Array.isArray($values)) { |
for (let i = 0, end = $values.length - 1; i < end; i += 2) { |
@@ -441,43 +441,64 @@ const_(obj) => JS('', '''(() => { |
// The following are helpers for Object methods when the receiver |
// may be null or primitive. These should only be generated by |
// the compiler. |
-hashCode(obj) => JS('', '''(() => { |
- if ($obj == null) { |
- return 0; |
+hashCode(obj) { |
+ if (obj == null) return 0; |
+ |
+ switch (JS('String', 'typeof #', obj)) { |
+ case "number": |
+ return JS('','# & 0x1FFFFFFF', obj); |
+ case "boolean": |
+ // From JSBool.hashCode, see comment there. |
+ return JS('', '# ? (2 * 3 * 23 * 3761) : (269 * 811)', obj); |
} |
- // TODO(vsm): What should we do for primitives and non-Dart objects? |
- switch (typeof $obj) { |
- case "number": |
- case "boolean": |
- return $obj & 0x1FFFFFFF; |
- case "string": |
- // TODO(vsm): Call the JSString hashCode? |
- return $obj.length; |
+ |
+ var extension = getExtensionType(obj); |
+ if (extension != null) { |
+ return JS('', '#[dartx.hashCode]', obj); |
} |
- return $obj.hashCode; |
-})()'''); |
+ return JS('', '#.hashCode', obj); |
+} |
-toString(obj) => JS('', '''(() => { |
- if ($obj == null) { |
- return "null"; |
+@JSExportName('toString') |
+_toString(obj) { |
+ if (obj == null) return "null"; |
+ |
+ var extension = getExtensionType(obj); |
+ if (extension != null) { |
+ return JS('', '#[dartx.toString]()', obj); |
} |
- return $obj.toString(); |
-})()'''); |
+ return JS('', '#.toString()', obj); |
+} |
-noSuchMethod(obj, invocation) => JS('', '''(() => { |
- if ($obj == null) { |
- $throwNoSuchMethod($obj, $invocation.memberName, |
- $invocation.positionalArguments, $invocation.namedArguments); |
+// TODO(jmesserly): is the argument type verified statically? |
+noSuchMethod(obj, Invocation invocation) { |
+ if (obj == null) { |
+ throw new NoSuchMethodError( |
+ null, |
+ invocation.memberName, |
+ invocation.positionalArguments, |
+ invocation.namedArguments); |
} |
- switch (typeof $obj) { |
- case "number": |
- case "boolean": |
- case "string": |
- $throwNoSuchMethod($obj, $invocation.memberName, |
- $invocation.positionalArguments, $invocation.namedArguments); |
+ // Delegate to the (possibly user-defined) method on the object. |
+ var extension = getExtensionType(obj); |
+ if (extension != null) { |
+ return JS('', '#[dartx.noSuchMethod](#)', obj, invocation); |
} |
- return $obj.noSuchMethod($invocation); |
-})()'''); |
+ return JS('', '#.noSuchMethod(#)', obj, invocation); |
+} |
+ |
+runtimeType(obj) { |
+ // Handle primitives where the method isn't on the object. |
+ var result = _checkPrimitiveType(obj); |
+ if (result != null) return wrapType(result); |
+ |
+ // Delegate to the (possibly user-defined) method on the object. |
+ var extension = getExtensionType(obj); |
+ if (extension != null) { |
+ return JS('', '#[dartx.runtimeType]', obj); |
+ } |
+ return JS('', '#.runtimeType', obj); |
+} |
final JsIterator = JS('', ''' |
class JsIterator { |