Index: pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart |
index 520768557a5dc79dd0a3c9cfc3080eb8c6c5ccd6..2eabee093631d2fcf74a6d1e7a3a4329a1800287 100644 |
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart |
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart |
@@ -13,6 +13,8 @@ class InterceptorStubGenerator { |
Emitter get emitter => backend.emitter.emitter; |
+ BackendHelpers get helpers => backend.helpers; |
+ |
jsAst.Expression generateGetInterceptorMethod(Set<ClassElement> classes) { |
jsAst.Expression interceptorFor(ClassElement cls) { |
return backend.emitter.interceptorPrototypeAccess(cls); |
@@ -25,20 +27,20 @@ class InterceptorStubGenerator { |
jsAst.Statement buildInterceptorCheck(ClassElement cls) { |
jsAst.Expression condition; |
assert(backend.isInterceptorClass(cls)); |
- if (cls == backend.jsBoolClass) { |
+ if (cls == helpers.jsBoolClass) { |
condition = js('(typeof receiver) == "boolean"'); |
- } else if (cls == backend.jsIntClass || |
- cls == backend.jsDoubleClass || |
- cls == backend.jsNumberClass) { |
+ } else if (cls == helpers.jsIntClass || |
+ cls == helpers.jsDoubleClass || |
+ cls == helpers.jsNumberClass) { |
throw 'internal error'; |
- } else if (cls == backend.jsArrayClass || |
- cls == backend.jsMutableArrayClass || |
- cls == backend.jsFixedArrayClass || |
- cls == backend.jsExtendableArrayClass) { |
+ } else if (cls == helpers.jsArrayClass || |
+ cls == helpers.jsMutableArrayClass || |
+ cls == helpers.jsFixedArrayClass || |
+ cls == helpers.jsExtendableArrayClass) { |
condition = js('receiver.constructor == Array'); |
- } else if (cls == backend.jsStringClass) { |
+ } else if (cls == helpers.jsStringClass) { |
condition = js('(typeof receiver) == "string"'); |
- } else if (cls == backend.jsNullClass) { |
+ } else if (cls == helpers.jsNullClass) { |
condition = js('receiver == null'); |
} else { |
throw 'internal error'; |
@@ -58,16 +60,16 @@ class InterceptorStubGenerator { |
.hasInstantiatedNativeClasses(); |
for (ClassElement cls in classes) { |
- if (cls == backend.jsArrayClass || |
- cls == backend.jsMutableArrayClass || |
- cls == backend.jsFixedArrayClass || |
- cls == backend.jsExtendableArrayClass) hasArray = true; |
- else if (cls == backend.jsBoolClass) hasBool = true; |
- else if (cls == backend.jsDoubleClass) hasDouble = true; |
- else if (cls == backend.jsIntClass) hasInt = true; |
- else if (cls == backend.jsNullClass) hasNull = true; |
- else if (cls == backend.jsNumberClass) hasNumber = true; |
- else if (cls == backend.jsStringClass) hasString = true; |
+ if (cls == helpers.jsArrayClass || |
+ cls == helpers.jsMutableArrayClass || |
+ cls == helpers.jsFixedArrayClass || |
+ cls == helpers.jsExtendableArrayClass) hasArray = true; |
+ else if (cls == helpers.jsBoolClass) hasBool = true; |
+ else if (cls == helpers.jsDoubleClass) hasDouble = true; |
+ else if (cls == helpers.jsIntClass) hasInt = true; |
+ else if (cls == helpers.jsNullClass) hasNull = true; |
+ else if (cls == helpers.jsNumberClass) hasNumber = true; |
+ else if (cls == helpers.jsStringClass) hasString = true; |
else { |
// The set of classes includes classes mixed-in to interceptor classes |
// and user extensions of native classes. |
@@ -103,13 +105,13 @@ class InterceptorStubGenerator { |
/// is the fallback used when we have determined that receiver |
/// is a JavaScript Number. |
jsAst.Expression interceptorForNumber = interceptorFor( |
- hasDouble ? backend.jsDoubleClass : backend.jsNumberClass); |
+ hasDouble ? helpers.jsDoubleClass : helpers.jsNumberClass); |
if (hasInt) { |
whenNumber = js.statement('''{ |
if (Math.floor(receiver) == receiver) return #; |
return #; |
- }''', [interceptorFor(backend.jsIntClass), interceptorForNumber]); |
+ }''', [interceptorFor(helpers.jsIntClass), interceptorForNumber]); |
} else { |
whenNumber = js.statement('return #', interceptorForNumber); |
} |
@@ -118,10 +120,10 @@ class InterceptorStubGenerator { |
} |
if (hasString) { |
- statements.add(buildInterceptorCheck(backend.jsStringClass)); |
+ statements.add(buildInterceptorCheck(helpers.jsStringClass)); |
} |
if (hasNull) { |
- statements.add(buildInterceptorCheck(backend.jsNullClass)); |
+ statements.add(buildInterceptorCheck(helpers.jsNullClass)); |
} else { |
// Returning "undefined" or "null" here will provoke a JavaScript |
// TypeError which is later identified as a null-error by |
@@ -130,12 +132,12 @@ class InterceptorStubGenerator { |
js.statement('if (receiver == null) return receiver')); |
} |
if (hasBool) { |
- statements.add(buildInterceptorCheck(backend.jsBoolClass)); |
+ statements.add(buildInterceptorCheck(helpers.jsBoolClass)); |
} |
// TODO(ahe): It might be faster to check for Array before |
// function and bool. |
if (hasArray) { |
- statements.add(buildInterceptorCheck(backend.jsArrayClass)); |
+ statements.add(buildInterceptorCheck(helpers.jsArrayClass)); |
} |
if (hasNative) { |
@@ -147,13 +149,13 @@ class InterceptorStubGenerator { |
if (receiver instanceof #) return receiver; |
return #(receiver); |
}''', [ |
- interceptorFor(backend.jsJavaScriptFunctionClass), |
+ interceptorFor(helpers.jsJavaScriptFunctionClass), |
backend.emitter.constructorAccess(compiler.coreClasses.objectClass), |
backend.emitter |
- .staticFunctionAccess(backend.getNativeInterceptorMethod)])); |
+ .staticFunctionAccess(helpers.getNativeInterceptorMethod)])); |
} else { |
- ClassElement jsUnknown = backend.jsUnknownJavaScriptObjectClass; |
+ ClassElement jsUnknown = helpers.jsUnknownJavaScriptObjectClass; |
if (compiler.codegenWorld |
.directlyInstantiatedClasses.contains(jsUnknown)) { |
statements.add( |
@@ -184,9 +186,9 @@ class InterceptorStubGenerator { |
return a0 != null && receiver === a0; |
}'''); |
} |
- if (!classes.contains(backend.jsIntClass) |
- && !classes.contains(backend.jsNumberClass) |
- && !classes.contains(backend.jsDoubleClass)) { |
+ if (!classes.contains(helpers.jsIntClass) |
+ && !classes.contains(helpers.jsNumberClass) |
+ && !classes.contains(helpers.jsDoubleClass)) { |
return null; |
} |
if (selector.argumentCount == 1) { |
@@ -228,12 +230,12 @@ class InterceptorStubGenerator { |
// return receiver[a0] = a1; |
// } |
// } |
- bool containsArray = classes.contains(backend.jsArrayClass); |
- bool containsString = classes.contains(backend.jsStringClass); |
+ bool containsArray = classes.contains(helpers.jsArrayClass); |
+ bool containsString = classes.contains(helpers.jsStringClass); |
bool containsJsIndexable = |
- backend.jsIndexingBehaviorInterface.isResolved && classes.any((cls) { |
+ helpers.jsIndexingBehaviorInterface.isResolved && classes.any((cls) { |
return compiler.world.isSubtypeOf(cls, |
- backend.jsIndexingBehaviorInterface); |
+ helpers.jsIndexingBehaviorInterface); |
}); |
// The index set operator requires a check on its set value in |
// checked mode, so we don't optimize the interceptor if the |
@@ -310,7 +312,7 @@ class InterceptorStubGenerator { |
} |
jsAst.Name invocationName = backend.namer.invocationName(selector); |
- String globalObject = namer.globalObjectFor(backend.interceptorsLibrary); |
+ String globalObject = namer.globalObjectFor(helpers.interceptorsLibrary); |
jsAst.Statement optimizedPath = |
_fastPathForOneShotInterceptor(selector, classes); |