Index: lib/runtime/dart_sdk.js |
diff --git a/lib/runtime/dart_sdk.js b/lib/runtime/dart_sdk.js |
index 6fa4889a5d9981db9943f5ef46390fe71381153e..0dde04c962be23a9fac3e89f1ec2657770804c64 100644 |
--- a/lib/runtime/dart_sdk.js |
+++ b/lib/runtime/dart_sdk.js |
@@ -520,13 +520,31 @@ dart_library.library('dart_sdk', null, /* Imports */[ |
dart.dsetindex = function(obj, index, value) { |
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)) { |
- console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type)); |
- return true; |
- } |
- return false; |
+ dart._ignoreMemo = function(f) { |
+ let memo = new Map(); |
+ return (t1, t2) => { |
+ let map = memo.get(t1); |
+ let result; |
+ if (map) { |
+ result = map.get(t2); |
+ if (result !== void 0) return result; |
+ } else { |
+ memo.set(t1, map = new Map()); |
+ } |
+ result = f(t1, t2); |
+ map.set(t2, result); |
+ return result; |
+ }; |
}; |
+ dart._ignoreTypeFailure = (() => { |
+ return dart._ignoreMemo((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.isFunctionType(type) && dart.isFunctionType(actual) || !!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; |
+ } |
+ return false; |
+ }); |
+ })(); |
dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) { |
let actual = dart.getReifiedType(obj); |
let result = dart.isSubtype(actual, type); |
@@ -993,6 +1011,8 @@ dart_library.library('dart_sdk', null, /* Imports */[ |
return dart._getRuntimeType(type) === core.Type; |
}; |
dart.typeName = function(type) { |
+ if (type === void 0) return "undefined type"; |
+ if (type === null) return "null type"; |
if (type instanceof dart.TypeRep) { |
if (type instanceof dart.Typedef) { |
return type.name + "(" + type.functionType.toString() + ")"; |
@@ -1008,7 +1028,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ |
let allDynamic = true; |
result += '<'; |
for (let i = 0; i < args.length; ++i) { |
- if (i > 0) name += ', '; |
+ if (i > 0) result += ', '; |
let argName = dart.typeName(args[i]); |
if (argName != 'dynamic') allDynamic = false; |
result += argName; |
@@ -1087,20 +1107,28 @@ dart_library.library('dart_sdk', null, /* Imports */[ |
if (t === Boolean) return bool; |
return t; |
}; |
- dart.subtypeMap = new Map(); |
- dart.isSubtype = function(t1, t2) { |
- let map = dart.subtypeMap.get(t1); |
- let result; |
- if (map) { |
- result = map.get(t2); |
- if (result !== void 0) return result; |
- } else { |
- dart.subtypeMap.set(t1, map = new Map()); |
- } |
- result = dart.isSubtype_(t1, t2, true); |
- map.set(t2, result); |
- return result; |
+ dart._subtypeMemo = function(f) { |
+ let memo = new Map(); |
+ return (t1, t2) => { |
+ let map = memo.get(t1); |
+ let result; |
+ if (map) { |
+ result = map.get(t2); |
+ if (result !== void 0) return result; |
+ } else { |
+ memo.set(t1, map = new Map()); |
+ } |
+ console.log("Checking " + dart.typeName(t1) + " <: " + dart.typeName(t2)); |
+ result = f(t1, t2); |
+ map.set(t2, result); |
+ return result; |
+ }; |
}; |
+ dart.isSubtype = (() => { |
+ return dart._subtypeMemo((t1, t2) => { |
+ return dart.isSubtype_(t1, t2, true); |
+ }); |
+ })(); |
dart._isBottom = function(type) { |
return type == dart.bottom; |
}; |