Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
=================================================================== |
--- dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart (revision 30333) |
+++ dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart (working copy) |
@@ -231,6 +231,8 @@ |
TypeMask extendableArrayType; |
TypeMask nonNullType; |
+ /// Maps special classes to their implementation (JSXxx) class. |
+ Map<ClassElement, ClassElement> implementationClasses; |
Element getNativeInterceptorMethod; |
bool needToInitializeDispatchProperty = false; |
@@ -578,6 +580,14 @@ |
compiler.findInterceptor('UnknownJavaScriptObject'), |
]; |
+ implementationClasses = <ClassElement, ClassElement>{}; |
+ implementationClasses[compiler.intClass] = jsIntClass; |
+ implementationClasses[compiler.boolClass] = jsBoolClass; |
+ implementationClasses[compiler.numClass] = jsNumberClass; |
+ implementationClasses[compiler.doubleClass] = jsDoubleClass; |
+ implementationClasses[compiler.stringClass] = jsStringClass; |
+ implementationClasses[compiler.listClass] = jsArrayClass; |
+ |
jsIndexableClass = compiler.findInterceptor('JSIndexable'); |
jsMutableIndexableClass = compiler.findInterceptor('JSMutableIndexable'); |
@@ -1280,22 +1290,22 @@ |
} |
} |
+ Element getDartClass(Element element) { |
+ for (ClassElement dartClass in implementationClasses.keys) { |
+ if (element == implementationClasses[dartClass]) { |
+ return dartClass; |
+ } |
+ } |
+ return element; |
+ } |
+ |
Element getImplementationClass(Element element) { |
- if (element == compiler.intClass) { |
- return jsIntClass; |
- } else if (element == compiler.boolClass) { |
- return jsBoolClass; |
- } else if (element == compiler.numClass) { |
- return jsNumberClass; |
- } else if (element == compiler.doubleClass) { |
- return jsDoubleClass; |
- } else if (element == compiler.stringClass) { |
- return jsStringClass; |
- } else if (element == compiler.listClass) { |
- return jsArrayClass; |
- } else { |
- return element; |
+ for (ClassElement dartClass in implementationClasses.keys) { |
+ if (element == dartClass) { |
+ return implementationClasses[dartClass]; |
+ } |
} |
+ return element; |
} |
/** |
@@ -1715,6 +1725,7 @@ |
* need to access it. |
*/ |
bool isNeededForReflection(Element element) { |
+ element = getDartClass(element); |
if (hasInsufficientMirrorsUsed) return isTreeShakingDisabled; |
/// Record the name of [element] in [symbolsUsed]. Return true for |
/// convenience. |