| Index: lib/runtime/dart_sdk.js | 
| diff --git a/lib/runtime/dart_sdk.js b/lib/runtime/dart_sdk.js | 
| index 5386e8505573e6e69434132cccfccd57828265ac..9cbddbdc6b92c2f7c6dece11c14580870d1623cf 100644 | 
| --- a/lib/runtime/dart_sdk.js | 
| +++ b/lib/runtime/dart_sdk.js | 
| @@ -527,7 +527,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return false; | 
| }; | 
| dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) { | 
| -    let actual = dart.realRuntimeType(obj); | 
| +    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; | 
| @@ -541,12 +541,12 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| dart.is = function(obj, type) { | 
| if (dart.strongInstanceOf(obj, type)) return true; | 
| if (dart.isGroundType(type)) return false; | 
| -    let actual = dart.realRuntimeType(obj); | 
| +    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; | 
| -    let actual = dart.realRuntimeType(obj); | 
| +    let actual = dart.getReifiedType(obj); | 
| if (dart.isGroundType(type)) dart.throwCastError(actual, type); | 
| if (dart._ignoreTypeFailure(actual, type)) return obj; | 
| dart.throwStrongModeError('Strong mode cast failure from ' + dart.typeName(actual) + ' to ' + dart.typeName(type)); | 
| @@ -556,7 +556,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return null; | 
| } | 
| if (Math.floor(obj) != obj) { | 
| -      dart.throwCastError(dart.realRuntimeType(obj), core.int); | 
| +      dart.throwCastError(dart.getReifiedType(obj), core.int); | 
| } | 
| return obj; | 
| }; | 
| @@ -639,7 +639,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| }; | 
| dart.constants = new Map(); | 
| dart.const = function(obj) { | 
| -    let objectKey = [dart.realRuntimeType(obj)]; | 
| +    let objectKey = [dart.getReifiedType(obj)]; | 
| for (let name of dart.getOwnNamesAndSymbols(obj)) { | 
| objectKey.push(name); | 
| objectKey.push(obj[name]); | 
| @@ -739,18 +739,19 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| }; | 
| dart.runtimeType = function(obj) { | 
| let result = dart.checkPrimitiveType(obj); | 
| -    if (result !== null) return result; | 
| -    result = obj.runtimeType; | 
| -    if (result) return result; | 
| -    return dart._nonPrimitiveRuntimeType(obj); | 
| +    if (result !== null) return dart.wrapType(result); | 
| +    return obj.runtimeType; | 
| }; | 
| dart.getFunctionType = function(obj) { | 
| let args = Array(obj.length).fill(dart.dynamic); | 
| return dart.definiteFunctionType(dart.bottom, args); | 
| }; | 
| -  dart.realRuntimeType = function(obj) { | 
| +  dart.objectRuntimeType = function(obj) { | 
| +    return dart.wrapType(dart.getReifiedType(obj)); | 
| +  }; | 
| +  dart.getReifiedType = function(obj) { | 
| let result = dart.checkPrimitiveType(obj); | 
| -    if (result !== null) return result; | 
| +    if (result != null) return result; | 
| return dart._nonPrimitiveRuntimeType(obj); | 
| }; | 
| dart._nonPrimitiveRuntimeType = function(obj) { | 
| @@ -764,6 +765,12 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| } | 
| return result; | 
| }; | 
| +  dart.wrapType = function(type) { | 
| +    if (type.hasOwnProperty(dart._typeObject)) { | 
| +      return type[dart._typeObject]; | 
| +    } | 
| +    return type[dart._typeObject] = new dart.WrappedType(type); | 
| +  }; | 
| dart._getRuntimeType = function(value) { | 
| return value[dart._runtimeType]; | 
| }; | 
| @@ -779,6 +786,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| dart._mixins = Symbol("mixins"); | 
| dart.implements = Symbol("implements"); | 
| dart.metadata = Symbol("metadata"); | 
| +  dart._typeObject = Symbol("typeObject"); | 
| dart.TypeRep = class TypeRep { | 
| get name() { | 
| return this.toString(); | 
| @@ -811,6 +819,15 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| } | 
| }; | 
| dart.jsobject = new dart.JSObject(); | 
| +  dart.WrappedType = class WrappedType extends dart.TypeRep { | 
| +    constructor(type) { | 
| +      super(); | 
| +      this._runtimeType = type; | 
| +    } | 
| +    toString() { | 
| +      return dart.typeName(this._runtimeType); | 
| +    } | 
| +  }; | 
| dart.AbstractFunctionType = class AbstractFunctionType extends dart.TypeRep { | 
| constructor() { | 
| super(); | 
| @@ -978,15 +995,19 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| if (tag === core.Type) { | 
| let name = type.name; | 
| let args = dart.getGenericArgs(type); | 
| -      if (args) { | 
| -        name += '<'; | 
| -        for (let i = 0; i < args.length; ++i) { | 
| -          if (i > 0) name += ', '; | 
| -          name += dart.typeName(args[i]); | 
| -        } | 
| -        name += '>'; | 
| -      } | 
| -      return name; | 
| +      if (!args) return name; | 
| +      let result = name; | 
| +      let allDynamic = true; | 
| +      result += '<'; | 
| +      for (let i = 0; i < args.length; ++i) { | 
| +        if (i > 0) name += ', '; | 
| +        let argName = dart.typeName(args[i]); | 
| +        if (argName != 'dynamic') allDynamic = false; | 
| +        result += argName; | 
| +      } | 
| +      result += '>'; | 
| +      if (allDynamic) return name; | 
| +      return result; | 
| } | 
| if (tag) return "Not a type: " + tag.name; | 
| return "JSObject<" + type.name + ">"; | 
| @@ -1052,12 +1073,12 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return true; | 
| }; | 
| dart.canonicalType = function(t) { | 
| -    if (t === Object) return core.Object; | 
| -    if (t === Function) return core.Function; | 
| -    if (t === Array) return core.List; | 
| -    if (t === String) return core.String; | 
| -    if (t === Number) return core.double; | 
| -    if (t === Boolean) return core.bool; | 
| +    if (t === Object) return Object; | 
| +    if (t === Function) return Function; | 
| +    if (t === Array) return List; | 
| +    if (t === String) return String; | 
| +    if (t === Number) return double; | 
| +    if (t === Boolean) return bool; | 
| return t; | 
| }; | 
| dart.subtypeMap = new Map(); | 
| @@ -1260,7 +1281,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| dart.throw(new core.NoSuchMethodError(this, invocation.memberName, invocation.positionalArguments, invocation.namedArguments)); | 
| } | 
| get runtimeType() { | 
| -      return dart.realRuntimeType(this); | 
| +      return dart.objectRuntimeType(this); | 
| } | 
| }; | 
| dart.setSignature(core.Object, { | 
| @@ -1288,7 +1309,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| }; | 
| dart.lazyFn(_debugger._instanceof, () => [core.bool, [dart.dynamic, dart.dynamic]]); | 
| _debugger.getOwnPropertyNames = function(object) { | 
| -    return dart.as(dart.list(Object.getOwnPropertyNames(object), core.String), core.List$(core.String)); | 
| +    return dart.list(Object.getOwnPropertyNames(object), core.String); | 
| }; | 
| dart.lazyFn(_debugger.getOwnPropertyNames, () => [core.List$(core.String), [dart.dynamic]]); | 
| _debugger.getOwnPropertySymbols = function(object) { | 
| @@ -1316,14 +1337,14 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| }; | 
| dart.lazyFn(_debugger.isRegularDartObject, () => [core.bool, [dart.dynamic]]); | 
| _debugger.getObjectTypeName = function(object) { | 
| -    let realRuntimeType = dart.realRuntimeType(object); | 
| -    if (realRuntimeType == null) { | 
| +    let reifiedType = dart.getReifiedType(object); | 
| +    if (reifiedType == null) { | 
| if (_debugger._typeof(object) == 'function') { | 
| return '[[Raw JavaScript Function]]'; | 
| } | 
| return '<Error getting type name>'; | 
| } | 
| -    return _debugger.getTypeName(dart.as(realRuntimeType, core.Type)); | 
| +    return _debugger.getTypeName(dart.as(reifiedType, core.Type)); | 
| }; | 
| dart.lazyFn(_debugger.getObjectTypeName, () => [core.String, [dart.dynamic]]); | 
| _debugger.getTypeName = function(type) { | 
| @@ -1563,7 +1584,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return true; | 
| } | 
| [_addMembers](current, object, properties) { | 
| -      let className = dart.dload(dart.realRuntimeType(current), 'name'); | 
| +      let className = dart.dload(dart.getReifiedType(current), 'name'); | 
| for (let name of _debugger.getOwnPropertyNames(current)) { | 
| if (name == 'constructor' || name == '__proto__' || dart.equals(name, className)) continue; | 
| if (dart.notNull(_debugger.hasMethod(object, name))) { | 
| @@ -1621,13 +1642,13 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| _debugger.FunctionFormatter = class FunctionFormatter extends _debugger.Formatter { | 
| accept(object) { | 
| if (_debugger._typeof(object) != 'function') return false; | 
| -      return dart.realRuntimeType(object) != null; | 
| +      return dart.getReifiedType(object) != null; | 
| } | 
| hasChildren(object) { | 
| return true; | 
| } | 
| preview(object) { | 
| -      return dart.as(dart.typeName(dart.realRuntimeType(object)), core.String); | 
| +      return dart.as(dart.typeName(dart.getReifiedType(object)), core.String); | 
| } | 
| children(object) { | 
| return dart.list([new _debugger.NameValuePair({name: 'signature', value: this.preview(object)}), new _debugger.NameValuePair({name: 'JavaScript Function', value: object, skipDart: true})], _debugger.NameValuePair); | 
| @@ -1704,7 +1725,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| } | 
| [_getType](object) { | 
| if (dart.is(object, core.Type)) return object; | 
| -      return dart.realRuntimeType(object); | 
| +      return dart.getReifiedType(object); | 
| } | 
| preview(object) { | 
| let entry = dart.as(object, _debugger.ClassMetadata); | 
| @@ -1952,7 +1973,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return this ? 2 * 3 * 23 * 3761 : 269 * 811; | 
| } | 
| get runtimeType() { | 
| -      return core.bool; | 
| +      return dart.wrapType(core.bool); | 
| } | 
| }; | 
| _interceptors.JSBool[dart.implements] = () => [core.bool]; | 
| @@ -1972,7 +1993,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return 0; | 
| } | 
| get runtimeType() { | 
| -      return _interceptors.JSObject; | 
| +      return dart.wrapType(_interceptors.JSObject); | 
| } | 
| }; | 
| _interceptors.JavaScriptObject[dart.implements] = () => [_interceptors.JSObject]; | 
| @@ -3276,7 +3297,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return 536870911 & hash + ((16383 & hash) << 15); | 
| } | 
| get runtimeType() { | 
| -      return core.String; | 
| +      return dart.wrapType(core.String); | 
| } | 
| get [dartx.length]() { | 
| return this.length; | 
| @@ -9036,7 +9057,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return dart.toString(_js_helper.getRuntimeType(object)); | 
| } | 
| static objectToString(object) { | 
| -      let name = dart.typeName(dart.realRuntimeType(object)); | 
| +      let name = dart.typeName(dart.getReifiedType(object)); | 
| return `Instance of '${name}'`; | 
| } | 
| static dateNow() { | 
| @@ -10103,7 +10124,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| }; | 
| dart.fn(_js_helper.stringJoinUnchecked); | 
| _js_helper.getRuntimeType = function(object) { | 
| -    return dart.realRuntimeType(object); | 
| +    return dart.getReifiedType(object); | 
| }; | 
| dart.lazyFn(_js_helper.getRuntimeType, () => [core.Type, [dart.dynamic]]); | 
| _js_helper.getIndex = function(array, index) { | 
| @@ -10306,7 +10327,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return dart.throw(new core.UnimplementedError("ClassMirror.staticMembers unimplemented")); | 
| } | 
| get superclass() { | 
| -      if (dart.equals(this[_cls], core.Object)) { | 
| +      if (dart.equals(this[_cls], dart.wrapType(core.Object))) { | 
| return null; | 
| } else { | 
| return new _js_mirrors.JsClassMirror._(this[_cls].__proto__); | 
| @@ -10634,7 +10655,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return this.byteLength; | 
| } | 
| get runtimeType() { | 
| -      return typed_data.ByteBuffer; | 
| +      return dart.wrapType(typed_data.ByteBuffer); | 
| } | 
| [dartx.asUint8List](offsetInBytes, length) { | 
| if (offsetInBytes === void 0) offsetInBytes = 0; | 
| @@ -11041,7 +11062,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| } | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Float32x4List; | 
| +      return dart.wrapType(typed_data.Float32x4List); | 
| } | 
| static fromList(list) { | 
| if (dart.is(list, _native_typed_data.NativeFloat32x4List)) { | 
| @@ -11430,7 +11451,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| } | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Int32x4List; | 
| +      return dart.wrapType(typed_data.Int32x4List); | 
| } | 
| static fromList(list) { | 
| if (dart.is(list, _native_typed_data.NativeInt32x4List)) { | 
| @@ -11572,7 +11593,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| } | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Float64x2List; | 
| +      return dart.wrapType(typed_data.Float64x2List); | 
| } | 
| get buffer() { | 
| return this[_storage][dartx.buffer]; | 
| @@ -11781,7 +11802,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeByteData._create2(buffer, offsetInBytes) : _native_typed_data.NativeByteData._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.ByteData; | 
| +      return dart.wrapType(typed_data.ByteData); | 
| } | 
| get [dartx.elementSizeInBytes]() { | 
| return 1; | 
| @@ -12061,7 +12082,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeFloat32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat32List._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Float32List; | 
| +      return dart.wrapType(typed_data.Float32List); | 
| } | 
| [dartx.sublist](start, end) { | 
| if (end === void 0) end = null; | 
| @@ -12112,7 +12133,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeFloat64List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat64List._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Float64List; | 
| +      return dart.wrapType(typed_data.Float64List); | 
| } | 
| [dartx.sublist](start, end) { | 
| if (end === void 0) end = null; | 
| @@ -12164,7 +12185,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeInt16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt16List._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Int16List; | 
| +      return dart.wrapType(typed_data.Int16List); | 
| } | 
| [dartx.get](index) { | 
| this[_checkIndex](index, this[dartx.length]); | 
| @@ -12223,7 +12244,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeInt32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt32List._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Int32List; | 
| +      return dart.wrapType(typed_data.Int32List); | 
| } | 
| [dartx.get](index) { | 
| this[_checkIndex](index, this[dartx.length]); | 
| @@ -12282,7 +12303,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return dart.as(length == null ? _native_typed_data.NativeInt8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt8List._create3(buffer, offsetInBytes, length), _native_typed_data.NativeInt8List); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Int8List; | 
| +      return dart.wrapType(typed_data.Int8List); | 
| } | 
| [dartx.get](index) { | 
| this[_checkIndex](index, this[dartx.length]); | 
| @@ -12341,7 +12362,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeUint16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint16List._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Uint16List; | 
| +      return dart.wrapType(typed_data.Uint16List); | 
| } | 
| [dartx.get](index) { | 
| this[_checkIndex](index, this[dartx.length]); | 
| @@ -12400,7 +12421,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeUint32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint32List._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Uint32List; | 
| +      return dart.wrapType(typed_data.Uint32List); | 
| } | 
| [dartx.get](index) { | 
| this[_checkIndex](index, this[dartx.length]); | 
| @@ -12460,7 +12481,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeUint8ClampedList._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8ClampedList._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Uint8ClampedList; | 
| +      return dart.wrapType(typed_data.Uint8ClampedList); | 
| } | 
| get [dartx.length]() { | 
| return this.length; | 
| @@ -12523,7 +12544,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return length == null ? _native_typed_data.NativeUint8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8List._create3(buffer, offsetInBytes, length); | 
| } | 
| get runtimeType() { | 
| -      return typed_data.Uint8List; | 
| +      return dart.wrapType(typed_data.Uint8List); | 
| } | 
| get [dartx.length]() { | 
| return this.length; | 
| @@ -29486,7 +29507,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| } else if (o instanceof Date) { | 
| let ms = o.getTime(); | 
| return new core.DateTime.fromMillisecondsSinceEpoch(dart.asInt(ms)); | 
| -    } else if (dart.is(o, js._DartObject) && dart.jsobject != dart.realRuntimeType(o)) { | 
| +    } else if (dart.is(o, js._DartObject) && dart.jsobject != dart.getReifiedType(o)) { | 
| return o[_dartObj]; | 
| } else { | 
| return js._putIfAbsent(js._dartProxies, o, js._wrapToDart); | 
| @@ -30080,7 +30101,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| }; | 
| dart.lazyFn(mirrors.reflect, () => [mirrors.InstanceMirror, [core.Object]]); | 
| mirrors.reflectClass = function(key) { | 
| -    if (!dart.is(key, core.Type) || dart.equals(key, dart.dynamic)) { | 
| +    if (!dart.is(key, core.Type) || dart.equals(key, dart.wrapType(dart.dynamic))) { | 
| dart.throw(new core.ArgumentError(`${key} does not denote a class`)); | 
| } | 
| let tm = mirrors.reflectType(key); | 
| @@ -30091,7 +30112,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| }; | 
| dart.lazyFn(mirrors.reflectClass, () => [mirrors.ClassMirror, [core.Type]]); | 
| mirrors.reflectType = function(key) { | 
| -    if (dart.equals(key, dart.dynamic)) { | 
| +    if (dart.equals(key, dart.wrapType(dart.dynamic))) { | 
| return mirrors.currentMirrorSystem().dynamicType; | 
| } | 
| return _js_mirrors.reflectType(key); | 
| @@ -66477,7 +66498,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| return this[_parent$].altKey; | 
| } | 
| static _makeRecord() { | 
| -      let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(html$.KeyboardEvent); | 
| +      let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent)); | 
| return _js_helper.makeLeafDispatchRecord(interceptor); | 
| } | 
| wrap(parent) { | 
| @@ -68213,7 +68234,7 @@ dart_library.library('dart_sdk', null, /* Imports */[ | 
| if (!dart.equals(baseClassName, 'HTMLElement')) { | 
| dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement')); | 
| } | 
| -        this[_nativeType] = html$.HtmlElement; | 
| +        this[_nativeType] = dart.wrapType(html$.HtmlElement); | 
| } else { | 
| let element = document[dartx.createElement](extendsTag); | 
| if (!(element instanceof window[baseClassName])) { | 
|  |