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 c4b8f5200f6512093be2971a7b227e3a4b72e4f3..fabb2757930a074497df9420fa52bda5154c1469 100644 |
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
@@ -201,6 +201,14 @@ class JavaScriptBackend extends Backend { |
Element getInterceptorMethod; |
Element interceptedNames; |
+ /** |
+ * This element is a top-level variable (in generated output) that the |
+ * compiler initializes to a datastructure used to map from a Type to the |
+ * interceptor. See declaration of `mapTypeToInterceptor` in |
+ * `interceptors.dart`. |
+ */ |
+ Element mapTypeToInterceptor; |
+ |
HType stringType; |
HType indexablePrimitiveType; |
HType readableArrayType; |
@@ -356,7 +364,7 @@ class JavaScriptBackend extends Backend { |
bool isInterceptorClass(ClassElement element) { |
if (element == null) return false; |
- if (element.isNative()) return true; |
+ if (Elements.isNativeOrExtendsNative(element)) return true; |
if (interceptedClasses.contains(element)) return true; |
if (classesMixedIntoNativeClasses.contains(element)) return true; |
return false; |
@@ -412,7 +420,7 @@ class JavaScriptBackend extends Backend { |
Set<ClassElement> result = new Set<ClassElement>(); |
for (Element element in intercepted) { |
ClassElement classElement = element.getEnclosingClass(); |
- if (classElement.isNative() |
+ if (Elements.isNativeOrExtendsNative(classElement) |
|| interceptedClasses.contains(classElement)) { |
result.add(classElement); |
} |
@@ -454,6 +462,8 @@ class JavaScriptBackend extends Backend { |
compiler.findInterceptor(const SourceString('getInterceptor')); |
interceptedNames = |
compiler.findInterceptor(const SourceString('interceptedNames')); |
+ mapTypeToInterceptor = |
+ compiler.findInterceptor(const SourceString('mapTypeToInterceptor')); |
dispatchPropertyName = |
compiler.findInterceptor(const SourceString('dispatchPropertyName')); |
getDispatchPropertyMethod = |
@@ -594,7 +604,7 @@ class JavaScriptBackend extends Backend { |
member.name, () => new Set<Element>()); |
set.add(member); |
if (classElement == jsInterceptorClass) return; |
- if (!classElement.isNative()) { |
+ if (classElement.isMixinApplication) { |
MixinApplicationElement mixinApplication = classElement; |
assert(member.getEnclosingClass() == mixinApplication.mixin); |
classesMixedIntoNativeClasses.add(mixinApplication.mixin); |
@@ -703,7 +713,7 @@ class JavaScriptBackend extends Backend { |
addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements); |
} else if (cls == jsUnknownJavaScriptObjectClass) { |
addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements); |
- } else if (cls.isNative()) { |
+ } else if (Elements.isNativeOrExtendsNative(cls)) { |
addInterceptorsForNativeClassMembers(cls, enqueuer); |
} |
} |