| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// This library defines runtime operations on objects used by the code | 5 /// This library defines runtime operations on objects used by the code |
| 6 /// generator. | 6 /// generator. |
| 7 part of dart._runtime; | 7 part of dart._runtime; |
| 8 | 8 |
| 9 class InvocationImpl extends Invocation { | 9 class InvocationImpl extends Invocation { |
| 10 final Symbol memberName; | 10 final Symbol memberName; |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 !!$isSubtype(type, $StreamSubscription) && | 475 !!$isSubtype(type, $StreamSubscription) && |
| 476 !!$isSubtype(actual, $StreamSubscription)) { | 476 !!$isSubtype(actual, $StreamSubscription)) { |
| 477 console.warn('Ignoring cast fail from ' + $typeName(actual) + | 477 console.warn('Ignoring cast fail from ' + $typeName(actual) + |
| 478 ' to ' + $typeName(type)); | 478 ' to ' + $typeName(type)); |
| 479 return true; | 479 return true; |
| 480 } | 480 } |
| 481 return false; | 481 return false; |
| 482 }); | 482 }); |
| 483 })()'''); | 483 })()'''); |
| 484 | 484 |
| 485 /// Returns true if [obj] is an instance of [type] | 485 /// Returns true if [obj] is an instance of [type] in strong mode, otherwise |
| 486 /// Returns true if [obj] is a JS function and [type] is a function type | 486 /// false. |
| 487 /// Returns false if [obj] is not an instance of [type] in both spec | 487 /// |
| 488 /// and strong mode | 488 /// This also allows arbitrary JS function objects to be subtypes of every Dart |
| 489 /// Returns null if [obj] is not an instance of [type] in strong mode | 489 /// function types. |
| 490 /// but might be in spec mode | |
| 491 bool strongInstanceOf(obj, type, ignoreFromWhiteList) => JS('', '''(() => { | 490 bool strongInstanceOf(obj, type, ignoreFromWhiteList) => JS('', '''(() => { |
| 492 let actual = $getReifiedType($obj); | 491 let actual = $getReifiedType($obj); |
| 493 let result = $isSubtype(actual, $type); | 492 let result = $isSubtype(actual, $type); |
| 494 if (result || (actual == $int && $isSubtype($double, $type))) return true; | 493 if (result || |
| 495 if (actual == $jsobject && $_isFunctionType(type) && | 494 (actual == $int && $isSubtype($double, $type)) || |
| 496 typeof(obj) === 'function') { | 495 (actual == $jsobject && $_isFunctionType(type) && |
| 496 typeof(obj) === 'function')) { |
| 497 return true; | 497 return true; |
| 498 } | 498 } |
| 499 if (result === false) return false; | 499 if (result === null && |
| 500 if (!dart.__ignoreWhitelistedErrors || | 500 dart.__ignoreWhitelistedErrors && |
| 501 ($ignoreFromWhiteList == void 0)) { | 501 $ignoreFromWhiteList && |
| 502 return result; | 502 $_ignoreTypeFailure(actual, $type)) { |
| 503 return true; |
| 503 } | 504 } |
| 504 if ($_ignoreTypeFailure(actual, $type)) return true; | 505 return false; |
| 505 return result; | |
| 506 })()'''); | 506 })()'''); |
| 507 | 507 |
| 508 /// Returns true if [obj] is null or an instance of [type] | 508 /// Returns true if [obj] is null or an instance of [type] |
| 509 /// Returns false if [obj] is non-null and not an instance of [type] | 509 /// Returns false if [obj] is non-null and not an instance of [type] |
| 510 /// in strong mode | 510 /// in strong mode |
| 511 instanceOfOrNull(obj, type) => JS('', '''(() => { | 511 bool instanceOfOrNull(obj, type) { |
| 512 // If strongInstanceOf returns null, convert to false here. | 512 // If strongInstanceOf returns null, convert to false here. |
| 513 if (($obj == null) || $strongInstanceOf($obj, $type, true)) return true; | 513 return obj == null || JS('bool', '#', strongInstanceOf(obj, type, true)); |
| 514 return false; | 514 } |
| 515 })()'''); | |
| 516 | 515 |
| 517 @JSExportName('is') | 516 @JSExportName('is') |
| 518 bool instanceOf(obj, type) => JS('', '''(() => { | 517 bool instanceOf(obj, type) { |
| 519 if ($obj == null) { | 518 if (obj == null) { |
| 520 return $type == $Null || $_isTop($type); | 519 return JS('bool', '# == # || #', type, Null, _isTop(type)); |
| 521 } | 520 } |
| 522 let result = $strongInstanceOf($obj, $type); | 521 return strongInstanceOf(obj, type, false); |
| 523 if (result !== null) return result; | 522 } |
| 524 if (!dart.__failForWeakModeIsChecks) return false; | |
| 525 let actual = $getReifiedType($obj); | |
| 526 let message = 'Strong mode is-check failure: ' + | |
| 527 $typeName(actual) + ' does not soundly subtype ' + | |
| 528 $typeName($type); | |
| 529 if (!dart.__ignoreAllErrors) { | |
| 530 $throwStrongModeError(message); | |
| 531 } | |
| 532 console.error(message); | |
| 533 return true; // Match Dart 1.0 Semantics when ignoring errors. | |
| 534 })()'''); | |
| 535 | 523 |
| 536 @JSExportName('as') | 524 @JSExportName('as') |
| 537 cast(obj, type) { | 525 cast(obj, type) { |
| 538 if (JS('bool', '# == #', type, dynamic) || obj == null) return obj; | 526 if (JS('bool', '# == #', type, dynamic) || obj == null) return obj; |
| 539 bool result = strongInstanceOf(obj, type, true); | 527 bool result = strongInstanceOf(obj, type, true); |
| 540 if (JS('bool', '#', result)) return obj; | 528 if (JS('bool', '#', result)) return obj; |
| 541 if (JS('bool', '!dart.__ignoreAllErrors')) { | 529 if (JS('bool', '!dart.__ignoreAllErrors')) { |
| 542 _throwCastError(obj, type, result); | 530 _throwCastError(obj, type, result); |
| 543 } | 531 } |
| 544 JS('', 'console.error(#)', | 532 JS('', 'console.error(#)', |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 /// Libraries are not actually deferred in DDC, so this just returns a future | 994 /// Libraries are not actually deferred in DDC, so this just returns a future |
| 1007 /// that completes immediately. | 995 /// that completes immediately. |
| 1008 Future loadLibrary() => new Future.value(); | 996 Future loadLibrary() => new Future.value(); |
| 1009 | 997 |
| 1010 /// Defines lazy statics. | 998 /// Defines lazy statics. |
| 1011 void defineLazy(to, from) { | 999 void defineLazy(to, from) { |
| 1012 for (var name in getOwnNamesAndSymbols(from)) { | 1000 for (var name in getOwnNamesAndSymbols(from)) { |
| 1013 defineLazyProperty(to, name, getOwnPropertyDescriptor(from, name)); | 1001 defineLazyProperty(to, name, getOwnPropertyDescriptor(from, name)); |
| 1014 } | 1002 } |
| 1015 } | 1003 } |
| OLD | NEW |