Index: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
index 17066d60754c0da97f28774e4fbb6dbfe98f8774..91f541ea3cf5789bb0091a2c03ac2ee745ba91be 100644 |
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart |
@@ -482,56 +482,44 @@ final _ignoreTypeFailure = JS('', '''(() => { |
}); |
})()'''); |
-/// Returns true if [obj] is an instance of [type] |
-/// Returns true if [obj] is a JS function and [type] is a function type |
-/// Returns false if [obj] is not an instance of [type] in both spec |
-/// and strong mode |
-/// Returns null if [obj] is not an instance of [type] in strong mode |
-/// but might be in spec mode |
+/// Returns true if [obj] is an instance of [type] in strong mode, otherwise |
+/// false. |
+/// |
+/// This also allows arbitrary JS function objects to be subtypes of every Dart |
+/// function types. |
bool strongInstanceOf(obj, type, ignoreFromWhiteList) => JS('', '''(() => { |
let actual = $getReifiedType($obj); |
let result = $isSubtype(actual, $type); |
- if (result || (actual == $int && $isSubtype($double, $type))) return true; |
- if (actual == $jsobject && $_isFunctionType(type) && |
- typeof(obj) === 'function') { |
+ if (result || |
+ (actual == $int && $isSubtype($double, $type)) || |
+ (actual == $jsobject && $_isFunctionType(type) && |
+ typeof(obj) === 'function')) { |
return true; |
} |
- if (result === false) return false; |
- if (!dart.__ignoreWhitelistedErrors || |
- ($ignoreFromWhiteList == void 0)) { |
- return result; |
+ if (result === null && |
+ dart.__ignoreWhitelistedErrors && |
+ $ignoreFromWhiteList && |
+ $_ignoreTypeFailure(actual, $type)) { |
+ return true; |
} |
- if ($_ignoreTypeFailure(actual, $type)) return true; |
- return result; |
+ return false; |
})()'''); |
/// Returns true if [obj] is null or an instance of [type] |
/// Returns false if [obj] is non-null and not an instance of [type] |
/// in strong mode |
-instanceOfOrNull(obj, type) => JS('', '''(() => { |
+bool instanceOfOrNull(obj, type) { |
// If strongInstanceOf returns null, convert to false here. |
- if (($obj == null) || $strongInstanceOf($obj, $type, true)) return true; |
- return false; |
-})()'''); |
+ return obj == null || JS('bool', '#', strongInstanceOf(obj, type, true)); |
+} |
@JSExportName('is') |
-bool instanceOf(obj, type) => JS('', '''(() => { |
- if ($obj == null) { |
- return $type == $Null || $_isTop($type); |
+bool instanceOf(obj, type) { |
+ if (obj == null) { |
+ return JS('bool', '# == # || #', type, Null, _isTop(type)); |
} |
- let result = $strongInstanceOf($obj, $type); |
- if (result !== null) return result; |
- if (!dart.__failForWeakModeIsChecks) return false; |
- let actual = $getReifiedType($obj); |
- let message = 'Strong mode is-check failure: ' + |
- $typeName(actual) + ' does not soundly subtype ' + |
- $typeName($type); |
- if (!dart.__ignoreAllErrors) { |
- $throwStrongModeError(message); |
- } |
- console.error(message); |
- return true; // Match Dart 1.0 Semantics when ignoring errors. |
-})()'''); |
+ return strongInstanceOf(obj, type, false); |
+} |
@JSExportName('as') |
cast(obj, type) { |