| Index: lib/runtime/dart_sdk.js
|
| diff --git a/lib/runtime/dart_sdk.js b/lib/runtime/dart_sdk.js
|
| index ae69b0750929bc0e2f68ac7856dcc7dc8c9b98dd..569af36d6c88fbd6d333ccf276a4506ba3a1d277 100644
|
| --- a/lib/runtime/dart_sdk.js
|
| +++ b/lib/runtime/dart_sdk.js
|
| @@ -257,7 +257,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| derived.prototype.__proto__ = base.prototype;
|
| };
|
| dart.throwCastError = function(actual, type) {
|
| - dart.throw(new _js_helper.CastErrorImplementation(actual, type));
|
| + dart.throw(new _js_helper.CastErrorImplementation(dart.typeName(actual), dart.typeName(type)));
|
| };
|
| dart.throwAssertionError = function() {
|
| dart.throw(new core.AssertionError());
|
| @@ -520,7 +520,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| return dart._callMethod(obj, 'set', null, [index, value], '[]=');
|
| };
|
| dart._ignoreTypeFailure = function(actual, type) {
|
| - if (dart.isSubtype(type, core.Iterable) && dart.isSubtype(actual, core.Iterable) || dart.isSubtype(type, async.Future) && dart.isSubtype(actual, async.Future) || dart.isSubtype(type, core.Map) && dart.isSubtype(actual, core.Map) || dart.isSubtype(type, core.Function) && dart.isSubtype(actual, core.Function) || dart.isSubtype(type, async.Stream) && dart.isSubtype(actual, async.Stream) || dart.isSubtype(type, async.StreamSubscription) && dart.isSubtype(actual, async.StreamSubscription)) {
|
| + if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || !!dart.isSubtype(type, core.Function) && !!dart.isSubtype(actual, core.Function) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
|
| console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
|
| return true;
|
| }
|
| @@ -528,27 +528,28 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| };
|
| dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) {
|
| let actual = dart.getReifiedType(obj);
|
| - if (dart.isSubtype(actual, type) || actual == dart.jsobject || actual == core.int && type == core.double) return true;
|
| - if (ignoreFromWhiteList == void 0) return false;
|
| - if (dart.isGroundType(type)) return false;
|
| + let result = dart.isSubtype(actual, type);
|
| + if (result || actual == dart.jsobject || actual == core.int && type == core.double) return true;
|
| + if (ignoreFromWhiteList == void 0) return result;
|
| if (dart._ignoreTypeFailure(actual, type)) return true;
|
| - return false;
|
| + return result;
|
| };
|
| dart.instanceOfOrNull = function(obj, type) {
|
| if (obj == null || dart.strongInstanceOf(obj, type, true)) return true;
|
| return false;
|
| };
|
| dart.is = function(obj, type) {
|
| - if (dart.strongInstanceOf(obj, type)) return true;
|
| - if (dart.isGroundType(type)) return false;
|
| + let result = dart.strongInstanceOf(obj, type);
|
| + if (result !== null) return result;
|
| let actual = dart.getReifiedType(obj);
|
| dart.throwStrongModeError('Strong mode is check failure: ' + dart.typeName(actual) + ' does not soundly subtype ' + dart.typeName(type));
|
| };
|
| dart.as = function(obj, type) {
|
| - if (dart.instanceOfOrNull(obj, type)) return obj;
|
| + if (obj == null) return obj;
|
| + let result = dart.strongInstanceOf(obj, type, true);
|
| + if (result) return obj;
|
| let actual = dart.getReifiedType(obj);
|
| - if (dart.isGroundType(type)) dart.throwCastError(actual, type);
|
| - if (dart._ignoreTypeFailure(actual, type)) return obj;
|
| + if (result === false) dart.throwCastError(actual, type);
|
| dart.throwStrongModeError('Strong mode cast failure from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
|
| };
|
| dart.asInt = function(obj) {
|
| @@ -990,7 +991,12 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| return dart._getRuntimeType(type) === core.Type;
|
| };
|
| dart.typeName = function(type) {
|
| - if (type instanceof dart.TypeRep) return type.toString();
|
| + if (type instanceof dart.TypeRep) {
|
| + if (type instanceof dart.Typedef) {
|
| + return type.name + "(" + type.functionType.toString() + ")";
|
| + }
|
| + return type.toString();
|
| + }
|
| let tag = dart._getRuntimeType(type);
|
| if (tag === core.Type) {
|
| let name = type.name;
|
| @@ -1019,41 +1025,36 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| dart.isFunctionType = function(type) {
|
| return type instanceof dart.AbstractFunctionType || type === core.Function;
|
| };
|
| - dart.isFunctionSubType = function(ft1, ft2) {
|
| - if (ft2 == core.Function) {
|
| + dart.isFunctionSubtype = function(ft1, ft2, covariant) {
|
| + if (ft2 === core.Function) {
|
| return true;
|
| }
|
| let ret1 = ft1.returnType;
|
| let ret2 = ft2.returnType;
|
| - if (!dart.isSubtype_(ret1, ret2)) {
|
| - if (ret2 != dart.void) {
|
| - return false;
|
| - }
|
| - }
|
| let args1 = ft1.args;
|
| let args2 = ft2.args;
|
| if (args1.length > args2.length) {
|
| - return false;
|
| + return covariant ? false : null;
|
| }
|
| for (let i = 0; i < args1.length; ++i) {
|
| - if (!dart.isSubtype_(args2[i], args1[i])) {
|
| - return false;
|
| + if (!dart.isSubtype_(args2[i], args1[i], !covariant)) {
|
| + return null;
|
| }
|
| }
|
| let optionals1 = ft1.optionals;
|
| let optionals2 = ft2.optionals;
|
| if (args1.length + optionals1.length < args2.length + optionals2.length) {
|
| - return false;
|
| + return covariant ? false : null;
|
| }
|
| let j = 0;
|
| for (let i = args1.length; i < args2.length; ++i, ++j) {
|
| - if (!dart.isSubtype_(args2[i], optionals1[j])) {
|
| - return false;
|
| + if (!dart.isSubtype_(args2[i], optionals1[j], !covariant)) {
|
| + return null;
|
| }
|
| }
|
| for (let i = 0; i < optionals2.length; ++i, ++j) {
|
| - if (!dart.isSubtype_(optionals2[i], optionals1[j])) {
|
| - return false;
|
| + if (!dart.isSubtype_(optionals2[i], optionals1[j], !covariant)) {
|
| + return null;
|
| }
|
| }
|
| let named1 = ft1.named;
|
| @@ -1064,10 +1065,17 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| let n1 = named1[name];
|
| let n2 = named2[name];
|
| if (n1 === void 0) {
|
| - return false;
|
| + return covariant ? false : null;
|
| }
|
| - if (!dart.isSubtype_(n2, n1)) {
|
| - return false;
|
| + if (!dart.isSubtype_(n2, n1, !covariant)) {
|
| + return null;
|
| + }
|
| + }
|
| + let result = dart.isSubtype_(ret1, ret2, covariant);
|
| + if (result === null) return result;
|
| + if (!result) {
|
| + if (ret2 !== dart.void) {
|
| + return null;
|
| }
|
| }
|
| return true;
|
| @@ -1091,7 +1099,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| } else {
|
| dart.subtypeMap.set(t1, map = new Map());
|
| }
|
| - result = dart.isSubtype_(t1, t2);
|
| + result = dart.isSubtype_(t1, t2, true);
|
| map.set(t2, result);
|
| return result;
|
| };
|
| @@ -1101,27 +1109,28 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| dart._isTop = function(type) {
|
| return type == core.Object || type == dart.dynamic;
|
| };
|
| - dart.isSubtype_ = function(t1, t2) {
|
| + dart.isSubtype_ = function(t1, t2, covariant) {
|
| t1 = dart.canonicalType(t1);
|
| t2 = dart.canonicalType(t2);
|
| - if (t1 == t2) return true;
|
| + if (t1 === t2) return true;
|
| if (dart._isTop(t2) || dart._isBottom(t1)) {
|
| return true;
|
| }
|
| - if (dart._isTop(t1) || dart._isBottom(t2)) {
|
| + if (dart._isBottom(t2)) return null;
|
| + if (dart._isTop(t1)) {
|
| + if (t1 === dart.dynamic) return null;
|
| return false;
|
| }
|
| - if (dart.isClassSubType(t1, t2)) {
|
| - return true;
|
| - }
|
| + let result = dart.isClassSubType(t1, t2, covariant);
|
| + if (result === true || result === null) return result;
|
| t1 = dart.getImplicitFunctionType(t1);
|
| if (!t1) return false;
|
| if (dart.isFunctionType(t1) && dart.isFunctionType(t2)) {
|
| - return dart.isFunctionSubType(t1, t2);
|
| + return dart.isFunctionSubtype(t1, t2, covariant);
|
| }
|
| return false;
|
| };
|
| - dart.isClassSubType = function(t1, t2) {
|
| + dart.isClassSubType = function(t1, t2, covariant) {
|
| t1 = dart.canonicalType(t1);
|
| dart.assert(t2 == dart.canonicalType(t2));
|
| if (t1 == t2) return true;
|
| @@ -1136,29 +1145,41 @@ dart_library.library('dart_sdk', null, /* Imports */[
|
| if (typeArguments2.length == 0) {
|
| return true;
|
| } else if (length == 0) {
|
| - return false;
|
| + if (typeArguments2.every(dart._isTop)) return true;
|
| + return null;
|
| }
|
| dart.assert(length == typeArguments2.length);
|
| for (let i = 0; i < length; ++i) {
|
| - if (!dart.isSubtype(typeArguments1[i], typeArguments2[i])) {
|
| - return false;
|
| + let result = dart.isSubtype_(typeArguments1[i], typeArguments2[i], covariant);
|
| + if (!result) {
|
| + return result;
|
| }
|
| }
|
| return true;
|
| }
|
| - if (dart.isClassSubType(t1.__proto__, t2)) return true;
|
| + let indefinite = false;
|
| + function definitive(t1, t2) {
|
| + let result = dart.isClassSubType(t1, t2, covariant);
|
| + if (result == null) {
|
| + indefinite = true;
|
| + return false;
|
| + }
|
| + return result;
|
| + }
|
| + if (definitive(t1.__proto__, t2)) return true;
|
| let mixins = dart.getMixins(t1);
|
| if (mixins) {
|
| for (let m1 of mixins) {
|
| - if (m1 != null && dart.isClassSubType(m1, t2)) return true;
|
| + if (m1 != null && definitive(m1, t2)) return true;
|
| }
|
| }
|
| let getInterfaces = dart.getImplements(t1);
|
| if (getInterfaces) {
|
| for (let i1 of getInterfaces()) {
|
| - if (i1 != null && dart.isClassSubType(i1, t2)) return true;
|
| + if (i1 != null && definitive(i1, t2)) return true;
|
| }
|
| }
|
| + if (indefinite) return null;
|
| return false;
|
| };
|
| dart.isGroundType = function(type) {
|
|
|