Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| index 7a809b704837a6196034428490b1419483c962a2..a108ab9c15ff1000c1c39e83a407281957f29c00 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| @@ -268,7 +268,7 @@ class JavaScriptBackend extends Backend { |
| /** |
| * Set of classes whose methods are intercepted. |
| */ |
| - final Set<ClassElement> interceptedClasses = new Set<ClassElement>(); |
| + final Set<ClassElement> _interceptedClasses = new Set<ClassElement>(); |
| /** |
| * Set of classes used as mixins on native classes. Methods on these classes |
| @@ -557,10 +557,6 @@ class JavaScriptBackend extends Backend { |
| jsStringToString = compiler.lookupElementIn( |
| jsStringClass, const SourceString('toString')); |
| - for (ClassElement cls in classes) { |
| - if (cls != null) interceptedClasses.add(cls); |
| - } |
| - |
| typeLiteralClass = compiler.findHelper(const SourceString('TypeImpl')); |
| mapLiteralClass = |
| compiler.coreLibrary.find(const SourceString('LinkedHashMap')); |
| @@ -630,6 +626,7 @@ class JavaScriptBackend extends Backend { |
| Enqueuer enqueuer, |
| TreeElements elements) { |
| if (enqueuer.isResolutionQueue) { |
| + _interceptedClasses.add(cls); |
| cls.ensureResolved(compiler); |
| cls.forEachMember((ClassElement classElement, Element member) { |
| // All methods on [Object] are shadowed by [Interceptor]. |
| @@ -643,6 +640,11 @@ class JavaScriptBackend extends Backend { |
| enqueueClass(enqueuer, cls, elements); |
| } |
| + Set<ClassElement> get interceptedClasses { |
| + assert(compiler.enqueuer.resolution.queueIsClosed); |
| + return _interceptedClasses; |
| + } |
| + |
| void registerSpecializedGetInterceptor(Set<ClassElement> classes) { |
| String name = namer.getInterceptorName(getInterceptorMethod, classes); |
| if (classes.contains(jsInterceptorClass)) { |
| @@ -705,31 +707,41 @@ class JavaScriptBackend extends Backend { |
| } |
| ClassElement result = null; |
| if (cls == compiler.stringClass || cls == jsStringClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
|
ngeoffray
2013/08/27 08:55:02
Maybe move the registration of the super class in
Johnni Winther
2013/08/27 10:20:10
Done.
|
| addInterceptors(jsStringClass, enqueuer, elements); |
| } else if (cls == compiler.listClass |
| || cls == jsArrayClass |
| || cls == jsFixedArrayClass |
| || cls == jsExtendableArrayClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsArrayClass, enqueuer, elements); |
| - enqueueClass(enqueuer, jsFixedArrayClass, elements); |
| - enqueueClass(enqueuer, jsExtendableArrayClass, elements); |
| + addInterceptors(jsMutableArrayClass, enqueuer, elements); |
| + addInterceptors(jsFixedArrayClass, enqueuer, elements); |
| + addInterceptors(jsExtendableArrayClass, enqueuer, elements); |
| } else if (cls == compiler.intClass || cls == jsIntClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsIntClass, enqueuer, elements); |
| addInterceptors(jsNumberClass, enqueuer, elements); |
| } else if (cls == compiler.doubleClass || cls == jsDoubleClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsDoubleClass, enqueuer, elements); |
| addInterceptors(jsNumberClass, enqueuer, elements); |
| } else if (cls == compiler.boolClass || cls == jsBoolClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsBoolClass, enqueuer, elements); |
| } else if (cls == compiler.nullClass || cls == jsNullClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsNullClass, enqueuer, elements); |
| } else if (cls == compiler.numClass || cls == jsNumberClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsIntClass, enqueuer, elements); |
| addInterceptors(jsDoubleClass, enqueuer, elements); |
| addInterceptors(jsNumberClass, enqueuer, elements); |
| } else if (cls == jsPlainJavaScriptObjectClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements); |
| } else if (cls == jsUnknownJavaScriptObjectClass) { |
| + addInterceptors(jsInterceptorClass, enqueuer, elements); |
| addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements); |
| } else if (Elements.isNativeOrExtendsNative(cls)) { |
| addInterceptorsForNativeClassMembers(cls, enqueuer); |
| @@ -1284,6 +1296,23 @@ class JavaScriptBackend extends Backend { |
| } |
| } |
| + /** |
| + * Returns [:true:] if the checking of [type] is performed directly on the |
| + * object and not on an interceptor. |
| + */ |
| + bool hasDirectCheckFor(DartType type) { |
| + Element element = type.element; |
| + return element == compiler.stringClass || |
| + element == compiler.boolClass || |
| + element == compiler.numClass || |
| + element == compiler.intClass || |
| + element == compiler.doubleClass || |
| + element == jsArrayClass || |
| + element == jsMutableArrayClass || |
| + element == jsExtendableArrayClass || |
| + element == jsFixedArrayClass; |
| + } |
| + |
| Element getExceptionUnwrapper() { |
| return compiler.findHelper(const SourceString('unwrapException')); |
| } |