| Index: tool/input_sdk/private/ddc_runtime/classes.dart
 | 
| diff --git a/tool/input_sdk/private/ddc_runtime/classes.dart b/tool/input_sdk/private/ddc_runtime/classes.dart
 | 
| index 86923f83c33d6384d3c5f6a74cab5ebf5588b12b..fdc72a361eeef9dcbcd597e2f592c9da9cc6aeb9 100644
 | 
| --- a/tool/input_sdk/private/ddc_runtime/classes.dart
 | 
| +++ b/tool/input_sdk/private/ddc_runtime/classes.dart
 | 
| @@ -63,12 +63,20 @@ mixin(base, @rest mixins) => JS('', '''(() => {
 | 
|    return Mixin;
 | 
|  })()''');
 | 
|  
 | 
| +
 | 
| +/// The Symbol for storing type arguments on a specialized generic type.
 | 
| +final _mixins = JS('', 'Symbol("mixins")');
 | 
| +
 | 
|  getMixins(clazz) => JS('', '$clazz[$_mixins]');
 | 
|  
 | 
| -getImplements(clazz) => JS('', '$clazz[$implements_]');
 | 
| +@JSExportName('implements')
 | 
| +final _implements = JS('', 'Symbol("implements")');
 | 
| +
 | 
| +getImplements(clazz) => JS('', '#[#]', clazz, _implements);
 | 
|  
 | 
|  /// The Symbol for storing type arguments on a specialized generic type.
 | 
|  final _typeArguments = JS('', 'Symbol("typeArguments")');
 | 
| +
 | 
|  final _originalDeclaration = JS('', 'Symbol("originalDeclaration")');
 | 
|  
 | 
|  /// Memoize a generic type constructor function.
 | 
| @@ -82,7 +90,7 @@ generic(typeConstructor) => JS('', '''(() => {
 | 
|      if (args.length != length && args.length != 0) {
 | 
|        $throwInternalError('requires ' + length + ' or 0 type arguments');
 | 
|      }
 | 
| -    while (args.length < length) args.push($dynamicR);
 | 
| +    while (args.length < length) args.push($dynamic);
 | 
|  
 | 
|      let value = resultMap;
 | 
|      for (let i = 0; i < length; i++) {
 | 
| @@ -255,26 +263,40 @@ defineNamedConstructor(clazz, name) => JS('', '''(() => {
 | 
|  
 | 
|  final _extensionType = JS('', 'Symbol("extensionType")');
 | 
|  
 | 
| -getExtensionType(obj) => JS('', '$obj[$_extensionType]');
 | 
| +getExtensionType(obj) => JS('', '#[#]', obj, _extensionType);
 | 
|  
 | 
|  final dartx = JS('', 'dartx');
 | 
|  
 | 
| -getExtensionSymbol(name) => JS('', '''(() => {
 | 
| -  let sym = $dartx[$name];
 | 
| -  if (!sym) $dartx[$name] = sym = Symbol('dartx.' + $name.toString());
 | 
| +getExtensionSymbol(name) {
 | 
| +  var sym = JS('', 'dartx[#]', name);
 | 
| +  if (sym == null) {
 | 
| +    sym = JS('', 'Symbol("dartx." + #.toString())', name);
 | 
| +    JS('', 'dartx[#] = #', name, sym);
 | 
| +  }
 | 
|    return sym;
 | 
| -})()''');
 | 
| +}
 | 
|  
 | 
| -defineExtensionNames(names) => JS('', '$names.forEach($getExtensionSymbol)');
 | 
| +defineExtensionNames(names) =>
 | 
| +    JS('', '#.forEach(#)', names, getExtensionSymbol);
 | 
|  
 | 
|  // Install properties in prototype order.  Properties / descriptors from
 | 
|  // more specific types should overwrite ones from less specific types.
 | 
| -_installProperties(jsProto, extProto) => JS('', '''(() => {
 | 
| -  if (extProto !== $Object.prototype && extProto !== jsProto) {
 | 
| -    $_installProperties(jsProto, extProto.__proto__);
 | 
| +_installProperties(jsProto, extProto) {
 | 
| +  var coreObjProto = JS('', '#.prototype', Object);
 | 
| +  if (JS('bool', '# === #', extProto, coreObjProto)) {
 | 
| +    // core.Object members need to be copied from the non-symbol name to the
 | 
| +    // symbol name.
 | 
| +    for (var name in getOwnPropertyNames(coreObjProto)) {
 | 
| +      var desc = getOwnPropertyDescriptor(coreObjProto, name);
 | 
| +      defineProperty(jsProto, getExtensionSymbol(name), desc);
 | 
| +    }
 | 
| +    return;
 | 
|    }
 | 
| -  $copyTheseProperties(jsProto, extProto, $getOwnPropertySymbols(extProto));
 | 
| -})()''');
 | 
| +  if (JS('bool', '# !== #', jsProto, extProto)) {
 | 
| +    _installProperties(jsProto, JS('', '#.__proto__', extProto));
 | 
| +  }
 | 
| +  copyTheseProperties(jsProto, extProto, getOwnPropertySymbols(extProto));
 | 
| +}
 | 
|  
 | 
|  ///
 | 
|  /// Copy symbols from the prototype of the source to destination.
 | 
| 
 |