Chromium Code Reviews| Index: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
| diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
| index 4a8670bd65178dbd7914982df4ac822520dfaddc..8a9cd63fb563c914a6490b3cf637e773d1cd4a9c 100644 |
| --- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
| +++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart |
| @@ -410,7 +410,10 @@ defineExtensionNames(names) => |
| /// Install properties in prototype-first order. Properties / descriptors from |
| /// more specific types should overwrite ones from less specific types. |
| void _installProperties(jsProto, dartType, installedParent) { |
| - if (JS('bool', '# === #', dartType, Object)) { |
| + // Extension types should bottom out at core.Object. The one exception |
| + // is JSArray, which we rewire to the native Array type. |
|
Jennifer Messerly
2017/07/14 19:38:08
hmmm wait I don't understand the JSArray comment.
|
| + if (JS('bool', '# === # || # === #.Object', dartType, Object, dartType, |
| + global_)) { |
| _installPropertiesForObject(jsProto); |
| return; |
| } |
| @@ -437,15 +440,20 @@ void _installPropertiesForObject(jsProto) { |
| } |
| } |
| -/// Copy symbols from the prototype of the source to destination. |
| -/// These are the only properties safe to copy onto an existing public |
| -/// JavaScript class. |
| -registerExtension(jsType, dartExtType) => JS( |
| +var _extensionMap; |
|
Jennifer Messerly
2017/07/14 19:38:08
this can be eager initialized:
final _extensi
vsm
2017/07/19 15:59:02
Done.
|
| + |
| +_cacheExtension(name, dartExtType) { |
| + if (_extensionMap == null) _extensionMap = JS('', 'new Map()'); |
| + JS('', '#.set(#, #)', _extensionMap, name, dartExtType); |
| +} |
| + |
| +_applyExtension(jsType, dartExtType) => JS( |
| '', |
| '''(() => { |
| // TODO(vsm): Not all registered js types are real. |
| if (!jsType) return; |
| + let extProto = $dartExtType.prototype; |
|
Jennifer Messerly
2017/07/14 19:38:08
this line is unused. I'm guessing it was a merge c
vsm
2017/07/19 15:59:02
Done.
|
| let jsProto = $jsType.prototype; |
| // TODO(vsm): This sometimes doesn't exist on FF. These types will be |
| @@ -462,7 +470,7 @@ registerExtension(jsType, dartExtType) => JS( |
| if (originalDesc === void 0) return; |
| let originalSigFn = originalDesc.get; |
| $assert_(originalSigFn); |
| - $defineMemoizedGetter($jsType, sigF, originalSigFn); |
| + $defineMemoizedGetter(jsType, sigF, originalSigFn); |
| } |
| updateSig($_methodSig); |
| updateSig($_fieldSig); |
| @@ -470,6 +478,22 @@ registerExtension(jsType, dartExtType) => JS( |
| updateSig($_setterSig); |
| })()'''); |
| +/// Apply all registered extensions to a window. This is intended for |
| +/// different frames, where registrations need to be reapplied. |
| +applyAllExtensions(global) { |
| + JS('', '#.forEach((dartExtType, name) => #(#[name], dartExtType))', |
| + _extensionMap, _applyExtension, global); |
| +} |
| + |
| +/// Copy symbols from the prototype of the source to destination. |
| +/// These are the only properties safe to copy onto an existing public |
| +/// JavaScript class. |
| +registerExtension(name, dartExtType) { |
| + _cacheExtension(name, dartExtType); |
|
Jennifer Messerly
2017/07/14 19:38:08
based on suggestion above this is a 1-liner now an
vsm
2017/07/19 15:59:01
Done.
|
| + var jsType = JS('', '#[#]', global_, name); |
| + _applyExtension(jsType, dartExtType); |
| +} |
| + |
| /// |
| /// Mark a concrete type as implementing extension methods. |
| /// For example: `class MyIter implements Iterable`. |