Index: pkg/compiler/lib/src/js_backend/backend.dart |
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart |
index 4d3f0960c9dd91a0f55b339eda7b400677fa2eef..22bdd47a86d98af83b93db7823c98e63791696cf 100644 |
--- a/pkg/compiler/lib/src/js_backend/backend.dart |
+++ b/pkg/compiler/lib/src/js_backend/backend.dart |
@@ -220,43 +220,18 @@ enum SyntheticConstantKind { |
} |
class JavaScriptBackend extends Backend { |
- static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper'); |
- static final Uri DART_INTERCEPTORS = |
- new Uri(scheme: 'dart', path: '_interceptors'); |
- static final Uri DART_FOREIGN_HELPER = |
- new Uri(scheme: 'dart', path: '_foreign_helper'); |
- static final Uri DART_JS_MIRRORS = |
- new Uri(scheme: 'dart', path: '_js_mirrors'); |
- static final Uri DART_JS_NAMES = |
- new Uri(scheme: 'dart', path: '_js_names'); |
- static final Uri DART_EMBEDDED_NAMES = |
- new Uri(scheme: 'dart', path: '_js_embedded_names'); |
- static final Uri DART_ISOLATE_HELPER = |
- new Uri(scheme: 'dart', path: '_isolate_helper'); |
- static final Uri PACKAGE_JS = |
- new Uri(scheme: 'package', path: 'js/js.dart'); |
- static final Uri PACKAGE_LOOKUP_MAP = |
- new Uri(scheme: 'package', path: 'lookup_map/lookup_map.dart'); |
- |
- static const String INVOKE_ON = '_getCachedInvocation'; |
- static const String START_ROOT_ISOLATE = 'startRootIsolate'; |
- |
- |
String get patchVersion => emitter.patchVersion; |
bool get supportsReflection => emitter.emitter.supportsReflection; |
final Annotations annotations; |
- /// Reference to the internal library to lookup functions to always inline. |
- LibraryElement internalLibrary; |
- |
/// Set of classes that need to be considered for reflection although not |
/// otherwise visible during resolution. |
Iterable<ClassElement> get classesRequiredForReflection { |
// TODO(herhut): Clean this up when classes needed for rti are tracked. |
- return [closureClass, jsIndexableClass]; |
+ return [helpers.closureClass, helpers.jsIndexableClass]; |
} |
FunctionCompiler functionCompiler; |
@@ -272,74 +247,6 @@ class JavaScriptBackend extends Backend { |
FunctionInlineCache inlineCache = new FunctionInlineCache(); |
- LibraryElement jsHelperLibrary; |
- LibraryElement asyncLibrary; |
- LibraryElement interceptorsLibrary; |
- LibraryElement foreignLibrary; |
- LibraryElement isolateHelperLibrary; |
- |
- ClassElement closureClass; |
- ClassElement boundClosureClass; |
- Element assertUnreachableMethod; |
- Element invokeOnMethod; |
- |
- ClassElement jsInterceptorClass; |
- ClassElement jsStringClass; |
- ClassElement jsArrayClass; |
- ClassElement jsNumberClass; |
- ClassElement jsIntClass; |
- ClassElement jsDoubleClass; |
- ClassElement jsNullClass; |
- ClassElement jsBoolClass; |
- ClassElement jsPlainJavaScriptObjectClass; |
- ClassElement jsUnknownJavaScriptObjectClass; |
- ClassElement jsJavaScriptFunctionClass; |
- ClassElement jsJavaScriptObjectClass; |
- |
- ClassElement jsIndexableClass; |
- ClassElement jsMutableIndexableClass; |
- |
- ClassElement jsMutableArrayClass; |
- ClassElement jsFixedArrayClass; |
- ClassElement jsExtendableArrayClass; |
- ClassElement jsUnmodifiableArrayClass; |
- ClassElement jsPositiveIntClass; |
- ClassElement jsUInt32Class; |
- ClassElement jsUInt31Class; |
- |
- Element jsIndexableLength; |
- Element jsArrayTypedConstructor; |
- Element jsArrayRemoveLast; |
- Element jsArrayAdd; |
- Element jsStringSplit; |
- Element jsStringToString; |
- Element jsStringOperatorAdd; |
- Element objectEquals; |
- |
- ClassElement typeLiteralClass; |
- ClassElement mapLiteralClass; |
- ClassElement constMapLiteralClass; |
- ClassElement typeVariableClass; |
- ConstructorElement mapLiteralConstructor; |
- ConstructorElement mapLiteralConstructorEmpty; |
- Element mapLiteralUntypedMaker; |
- Element mapLiteralUntypedEmptyMaker; |
- |
- ClassElement noSideEffectsClass; |
- ClassElement noThrowsClass; |
- ClassElement noInlineClass; |
- ClassElement forceInlineClass; |
- ClassElement irRepresentationClass; |
- |
- ClassElement jsAnnotationClass; |
- |
- Element getInterceptorMethod; |
- |
- ClassElement jsInvocationMirrorClass; |
- |
- ClassElement typedArrayClass; |
- ClassElement typedArrayOfIntClass; |
- |
/// If [true], the compiler will emit code that logs whenever a method is |
/// called. When TRACE_METHOD is 'console' this will be logged |
/// directly in the JavaScript console. When TRACE_METHOD is 'post' the |
@@ -364,8 +271,8 @@ class JavaScriptBackend extends Backend { |
TypeMask _indexablePrimitiveTypeCache; |
TypeMask get indexablePrimitiveType { |
if (_indexablePrimitiveTypeCache == null) { |
- _indexablePrimitiveTypeCache = |
- new TypeMask.nonNullSubtype(jsIndexableClass, compiler.world); |
+ _indexablePrimitiveTypeCache = new TypeMask.nonNullSubtype( |
+ helpers.jsIndexableClass, compiler.world); |
} |
return _indexablePrimitiveTypeCache; |
} |
@@ -373,8 +280,8 @@ class JavaScriptBackend extends Backend { |
TypeMask _readableArrayTypeCache; |
TypeMask get readableArrayType { |
if (_readableArrayTypeCache == null) { |
- _readableArrayTypeCache = new TypeMask.nonNullSubclass(jsArrayClass, |
- compiler.world); |
+ _readableArrayTypeCache = new TypeMask.nonNullSubclass( |
+ helpers.jsArrayClass, compiler.world); |
} |
return _readableArrayTypeCache; |
} |
@@ -382,8 +289,8 @@ class JavaScriptBackend extends Backend { |
TypeMask _mutableArrayTypeCache; |
TypeMask get mutableArrayType { |
if (_mutableArrayTypeCache == null) { |
- _mutableArrayTypeCache = new TypeMask.nonNullSubclass(jsMutableArrayClass, |
- compiler.world); |
+ _mutableArrayTypeCache = new TypeMask.nonNullSubclass( |
+ helpers.jsMutableArrayClass, compiler.world); |
} |
return _mutableArrayTypeCache; |
} |
@@ -391,8 +298,8 @@ class JavaScriptBackend extends Backend { |
TypeMask _fixedArrayTypeCache; |
TypeMask get fixedArrayType { |
if (_fixedArrayTypeCache == null) { |
- _fixedArrayTypeCache = new TypeMask.nonNullExact(jsFixedArrayClass, |
- compiler.world); |
+ _fixedArrayTypeCache = new TypeMask.nonNullExact( |
+ helpers.jsFixedArrayClass, compiler.world); |
} |
return _fixedArrayTypeCache; |
} |
@@ -400,8 +307,8 @@ class JavaScriptBackend extends Backend { |
TypeMask _extendableArrayTypeCache; |
TypeMask get extendableArrayType { |
if (_extendableArrayTypeCache == null) { |
- _extendableArrayTypeCache = |
- new TypeMask.nonNullExact(jsExtendableArrayClass, compiler.world); |
+ _extendableArrayTypeCache = new TypeMask.nonNullExact( |
+ helpers.jsExtendableArrayClass, compiler.world); |
} |
return _extendableArrayTypeCache; |
} |
@@ -409,8 +316,8 @@ class JavaScriptBackend extends Backend { |
TypeMask _unmodifiableArrayTypeCache; |
TypeMask get unmodifiableArrayType { |
if (_unmodifiableArrayTypeCache == null) { |
- _unmodifiableArrayTypeCache = |
- new TypeMask.nonNullExact(jsUnmodifiableArrayClass, compiler.world); |
+ _unmodifiableArrayTypeCache = new TypeMask.nonNullExact( |
+ helpers.jsUnmodifiableArrayClass, compiler.world); |
} |
return _fixedArrayTypeCache; |
} |
@@ -427,24 +334,12 @@ class JavaScriptBackend extends Backend { |
/// Maps special classes to their implementation (JSXxx) class. |
Map<ClassElement, ClassElement> implementationClasses; |
- Element getNativeInterceptorMethod; |
bool needToInitializeIsolateAffinityTag = false; |
bool needToInitializeDispatchProperty = false; |
- /// Holds the method "getIsolateAffinityTag" when dart:_js_helper has been |
- /// loaded. |
- FunctionElement getIsolateAffinityTagMarker; |
- |
final Namer namer; |
/** |
- * Interface used to determine if an object has the JavaScript |
- * indexing behavior. The interface is only visible to specific |
- * libraries. |
- */ |
- ClassElement jsIndexingBehaviorInterface; |
- |
- /** |
* A collection of selectors that must have a one shot interceptor |
* generated. |
*/ |
@@ -515,35 +410,6 @@ class JavaScriptBackend extends Backend { |
final RuntimeTypes rti; |
final RuntimeTypesEncoder rtiEncoder; |
- /// Holds the method "disableTreeShaking" in js_mirrors when |
- /// dart:mirrors has been loaded. |
- FunctionElement disableTreeShakingMarker; |
- |
- /// Holds the method "preserveNames" in js_mirrors when |
- /// dart:mirrors has been loaded. |
- FunctionElement preserveNamesMarker; |
- |
- /// Holds the method "preserveMetadata" in js_mirrors when |
- /// dart:mirrors has been loaded. |
- FunctionElement preserveMetadataMarker; |
- |
- /// Holds the method "preserveUris" in js_mirrors when |
- /// dart:mirrors has been loaded. |
- FunctionElement preserveUrisMarker; |
- |
- /// Holds the method "preserveLibraryNames" in js_mirrors when |
- /// dart:mirrors has been loaded. |
- FunctionElement preserveLibraryNamesMarker; |
- |
- /// Holds the method "requiresPreamble" in _js_helper. |
- FunctionElement requiresPreambleMarker; |
- |
- /// Holds the class for the [JsGetName] enum. |
- EnumClassElement jsGetNameEnum; |
- |
- /// Holds the class for the [JsBuiltins] enum. |
- EnumClassElement jsBuiltinEnum; |
- |
/// True if a call to preserveMetadataMarker has been seen. This means that |
/// metadata must be retained for dart:mirrors to work correctly. |
bool mustRetainMetadata = false; |
@@ -700,24 +566,11 @@ class JavaScriptBackend extends Backend { |
}); |
} |
- // TODO(karlklose): Split into findHelperFunction and findHelperClass and |
- // add a check that the element has the expected kind. |
- Element findHelper(String name) => find(jsHelperLibrary, name); |
- Element findAsyncHelper(String name) => find(asyncLibrary, name); |
- Element findInterceptor(String name) => find(interceptorsLibrary, name); |
- |
- Element find(LibraryElement library, String name) { |
- Element element = library.implementation.findLocal(name); |
- assert(invariant(library, element != null, |
- message: "Element '$name' not found in '${library.canonicalUri}'.")); |
- return element; |
- } |
- |
- bool isForeign(Element element) => element.library == foreignLibrary; |
+ bool isForeign(Element element) => element.library == helpers.foreignLibrary; |
bool isBackendLibrary(LibraryElement library) { |
- return library == interceptorsLibrary || |
- library == jsHelperLibrary; |
+ return library == helpers.interceptorsLibrary || |
+ library == helpers.jsHelperLibrary; |
} |
static Namer determineNamer(Compiler compiler) { |
@@ -1117,7 +970,7 @@ class JavaScriptBackend extends Backend { |
Enqueuer enqueuer, |
Registry registry) { |
if (enqueuer.isResolutionQueue) { |
- _interceptedClasses.add(jsInterceptorClass); |
+ _interceptedClasses.add(helpers.jsInterceptorClass); |
_interceptedClasses.add(cls); |
cls.ensureResolved(resolution); |
cls.forEachMember((ClassElement classElement, Element member) { |
@@ -1139,7 +992,7 @@ class JavaScriptBackend extends Backend { |
void registerSpecializedGetInterceptor(Set<ClassElement> classes) { |
jsAst.Name name = namer.nameForGetInterceptor(classes); |
- if (classes.contains(jsInterceptorClass)) { |
+ if (classes.contains(helpers.jsInterceptorClass)) { |
// We can't use a specialized [getInterceptorMethod], so we make |
// sure we emit the one with all checks. |
specializedGetInterceptors[name] = interceptedClasses; |
@@ -1239,33 +1092,34 @@ class JavaScriptBackend extends Backend { |
cls == coreClasses.numClass) { |
// The backend will try to optimize number operations and use the |
// `iae` helper directly. |
- enqueue(enqueuer, findHelper('iae'), registry); |
+ enqueue(enqueuer, helpers.throwIllegalArgumentException, registry); |
} else if (cls == coreClasses.listClass || |
cls == coreClasses.stringClass) { |
// The backend will try to optimize array and string access and use the |
// `ioore` and `iae` helpers directly. |
- enqueue(enqueuer, findHelper('ioore'), registry); |
- enqueue(enqueuer, findHelper('iae'), registry); |
+ enqueue(enqueuer, helpers.throwIndexOutOfRangeException, registry); |
+ enqueue(enqueuer, helpers.throwIllegalArgumentException, registry); |
} else if (cls == coreClasses.functionClass) { |
- enqueueClass(enqueuer, closureClass, registry); |
+ enqueueClass(enqueuer, helpers.closureClass, registry); |
} else if (cls == coreClasses.mapClass) { |
// The backend will use a literal list to initialize the entries |
// of the map. |
enqueueClass(enqueuer, coreClasses.listClass, registry); |
- enqueueClass(enqueuer, mapLiteralClass, registry); |
+ enqueueClass(enqueuer, helpers.mapLiteralClass, registry); |
// For map literals, the dependency between the implementation class |
// and [Map] is not visible, so we have to add it manually. |
- rti.registerRtiDependency(mapLiteralClass, cls); |
- } else if (cls == boundClosureClass) { |
+ rti.registerRtiDependency(helpers.mapLiteralClass, cls); |
+ } else if (cls == helpers.boundClosureClass) { |
// TODO(johnniwinther): Is this a noop? |
- enqueueClass(enqueuer, boundClosureClass, registry); |
+ enqueueClass(enqueuer, helpers.boundClosureClass, registry); |
} else if (isNativeOrExtendsNative(cls)) { |
- enqueue(enqueuer, getNativeInterceptorMethod, registry); |
- enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies); |
- enqueueClass(enqueuer, jsJavaScriptObjectClass, registry); |
- enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); |
- enqueueClass(enqueuer, jsJavaScriptFunctionClass, registry); |
- } else if (cls == mapLiteralClass) { |
+ enqueue(enqueuer, helpers.getNativeInterceptorMethod, registry); |
+ enqueueClass(enqueuer, helpers.jsInterceptorClass, |
+ compiler.globalDependencies); |
+ enqueueClass(enqueuer, helpers.jsJavaScriptObjectClass, registry); |
+ enqueueClass(enqueuer, helpers.jsPlainJavaScriptObjectClass, registry); |
+ enqueueClass(enqueuer, helpers.jsJavaScriptFunctionClass, registry); |
+ } else if (cls == helpers.mapLiteralClass) { |
// For map literals, the dependency between the implementation class |
// and [Map] is not visible, so we have to add it manually. |
Element getFactory(String name, int arity) { |
@@ -1273,13 +1127,14 @@ class JavaScriptBackend extends Backend { |
// have a patch class. |
ClassElement implementation = cls.patch != null ? cls.patch : cls; |
ConstructorElement ctor = implementation.lookupConstructor(name); |
- if (ctor == null |
- || (Name.isPrivateName(name) |
- && ctor.library != mapLiteralClass.library)) { |
- reporter.internalError(mapLiteralClass, |
- "Map literal class $mapLiteralClass missing " |
- "'$name' constructor" |
- " ${mapLiteralClass.constructors}"); |
+ if (ctor == null || |
+ (Name.isPrivateName(name) && |
+ ctor.library != helpers.mapLiteralClass.library)) { |
+ reporter.internalError( |
+ helpers.mapLiteralClass, |
+ "Map literal class ${helpers.mapLiteralClass} missing " |
+ "'$name' constructor" |
+ " ${helpers.mapLiteralClass.constructors}"); |
} |
return ctor; |
} |
@@ -1289,79 +1144,79 @@ class JavaScriptBackend extends Backend { |
ClassElement implementation = cls.patch != null ? cls.patch : cls; |
Element element = implementation.lookupLocalMember(name); |
if (element == null || !element.isFunction || !element.isStatic) { |
- reporter.internalError(mapLiteralClass, |
- "Map literal class $mapLiteralClass missing " |
+ reporter.internalError(helpers.mapLiteralClass, |
+ "Map literal class ${helpers.mapLiteralClass} missing " |
"'$name' static member function"); |
} |
return element; |
} |
- mapLiteralConstructor = getFactory('_literal', 1); |
- mapLiteralConstructorEmpty = getFactory('_empty', 0); |
- enqueueInResolution(mapLiteralConstructor, registry); |
- enqueueInResolution(mapLiteralConstructorEmpty, registry); |
- |
- mapLiteralUntypedMaker = getMember('_makeLiteral'); |
- mapLiteralUntypedEmptyMaker = getMember('_makeEmpty'); |
- enqueueInResolution(mapLiteralUntypedMaker, registry); |
- enqueueInResolution(mapLiteralUntypedEmptyMaker, registry); |
+ helpers.mapLiteralConstructor = getFactory('_literal', 1); |
+ helpers.mapLiteralConstructorEmpty = getFactory('_empty', 0); |
+ enqueueInResolution(helpers.mapLiteralConstructor, registry); |
+ enqueueInResolution(helpers.mapLiteralConstructorEmpty, registry); |
+ |
+ helpers.mapLiteralUntypedMaker = getMember('_makeLiteral'); |
+ helpers.mapLiteralUntypedEmptyMaker = getMember('_makeEmpty'); |
+ enqueueInResolution(helpers.mapLiteralUntypedMaker, registry); |
+ enqueueInResolution(helpers.mapLiteralUntypedEmptyMaker, registry); |
} |
} |
- if (cls == closureClass) { |
- enqueue(enqueuer, findHelper('closureFromTearOff'), registry); |
+ if (cls == helpers.closureClass) { |
+ enqueue(enqueuer, helpers.closureFromTearOff, registry); |
} |
if (cls == coreClasses.stringClass || |
- cls == jsStringClass) { |
- addInterceptors(jsStringClass, enqueuer, registry); |
+ cls == helpers.jsStringClass) { |
+ addInterceptors(helpers.jsStringClass, enqueuer, registry); |
} else if (cls == coreClasses.listClass || |
- cls == jsArrayClass || |
- cls == jsFixedArrayClass || |
- cls == jsExtendableArrayClass || |
- cls == jsUnmodifiableArrayClass) { |
- addInterceptors(jsArrayClass, enqueuer, registry); |
- addInterceptors(jsMutableArrayClass, enqueuer, registry); |
- addInterceptors(jsFixedArrayClass, enqueuer, registry); |
- addInterceptors(jsExtendableArrayClass, enqueuer, registry); |
- addInterceptors(jsUnmodifiableArrayClass, enqueuer, registry); |
+ cls == helpers.jsArrayClass || |
+ cls == helpers.jsFixedArrayClass || |
+ cls == helpers.jsExtendableArrayClass || |
+ cls == helpers.jsUnmodifiableArrayClass) { |
+ addInterceptors(helpers.jsArrayClass, enqueuer, registry); |
+ addInterceptors(helpers.jsMutableArrayClass, enqueuer, registry); |
+ addInterceptors(helpers.jsFixedArrayClass, enqueuer, registry); |
+ addInterceptors(helpers.jsExtendableArrayClass, enqueuer, registry); |
+ addInterceptors(helpers.jsUnmodifiableArrayClass, enqueuer, registry); |
} else if (cls == coreClasses.intClass || |
- cls == jsIntClass) { |
- addInterceptors(jsIntClass, enqueuer, registry); |
- addInterceptors(jsPositiveIntClass, enqueuer, registry); |
- addInterceptors(jsUInt32Class, enqueuer, registry); |
- addInterceptors(jsUInt31Class, enqueuer, registry); |
- addInterceptors(jsNumberClass, enqueuer, registry); |
+ cls == helpers.jsIntClass) { |
+ addInterceptors(helpers.jsIntClass, enqueuer, registry); |
+ addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry); |
+ addInterceptors(helpers.jsUInt32Class, enqueuer, registry); |
+ addInterceptors(helpers.jsUInt31Class, enqueuer, registry); |
+ addInterceptors(helpers.jsNumberClass, enqueuer, registry); |
} else if (cls == coreClasses.doubleClass || |
- cls == jsDoubleClass) { |
- addInterceptors(jsDoubleClass, enqueuer, registry); |
- addInterceptors(jsNumberClass, enqueuer, registry); |
+ cls == helpers.jsDoubleClass) { |
+ addInterceptors(helpers.jsDoubleClass, enqueuer, registry); |
+ addInterceptors(helpers.jsNumberClass, enqueuer, registry); |
} else if (cls == coreClasses.boolClass || |
- cls == jsBoolClass) { |
- addInterceptors(jsBoolClass, enqueuer, registry); |
+ cls == helpers.jsBoolClass) { |
+ addInterceptors(helpers.jsBoolClass, enqueuer, registry); |
} else if (cls == coreClasses.nullClass || |
- cls == jsNullClass) { |
- addInterceptors(jsNullClass, enqueuer, registry); |
+ cls == helpers.jsNullClass) { |
+ addInterceptors(helpers.jsNullClass, enqueuer, registry); |
} else if (cls == coreClasses.numClass || |
- cls == jsNumberClass) { |
- addInterceptors(jsIntClass, enqueuer, registry); |
- addInterceptors(jsPositiveIntClass, enqueuer, registry); |
- addInterceptors(jsUInt32Class, enqueuer, registry); |
- addInterceptors(jsUInt31Class, enqueuer, registry); |
- addInterceptors(jsDoubleClass, enqueuer, registry); |
- addInterceptors(jsNumberClass, enqueuer, registry); |
- } else if (cls == jsJavaScriptObjectClass) { |
- addInterceptors(jsJavaScriptObjectClass, enqueuer, registry); |
- } else if (cls == jsPlainJavaScriptObjectClass) { |
- addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, registry); |
- } else if (cls == jsUnknownJavaScriptObjectClass) { |
- addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, registry); |
- } else if (cls == jsJavaScriptFunctionClass) { |
- addInterceptors(jsJavaScriptFunctionClass, enqueuer, registry); |
+ cls == helpers.jsNumberClass) { |
+ addInterceptors(helpers.jsIntClass, enqueuer, registry); |
+ addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry); |
+ addInterceptors(helpers.jsUInt32Class, enqueuer, registry); |
+ addInterceptors(helpers.jsUInt31Class, enqueuer, registry); |
+ addInterceptors(helpers.jsDoubleClass, enqueuer, registry); |
+ addInterceptors(helpers.jsNumberClass, enqueuer, registry); |
+ } else if (cls == helpers.jsJavaScriptObjectClass) { |
+ addInterceptors(helpers.jsJavaScriptObjectClass, enqueuer, registry); |
+ } else if (cls == helpers.jsPlainJavaScriptObjectClass) { |
+ addInterceptors(helpers.jsPlainJavaScriptObjectClass, enqueuer, registry); |
+ } else if (cls == helpers.jsUnknownJavaScriptObjectClass) { |
+ addInterceptors(helpers.jsUnknownJavaScriptObjectClass, enqueuer, registry); |
+ } else if (cls == helpers.jsJavaScriptFunctionClass) { |
+ addInterceptors(helpers.jsJavaScriptFunctionClass, enqueuer, registry); |
} else if (isNativeOrExtendsNative(cls)) { |
addInterceptorsForNativeClassMembers(cls, enqueuer); |
- } else if (cls == jsIndexingBehaviorInterface) { |
+ } else if (cls == helpers.jsIndexingBehaviorInterface) { |
// These two helpers are used by the emitter and the codegen. |
// Because we cannot enqueue elements at the time of emission, |
// we make sure they are always generated. |
- enqueue(enqueuer, findHelper('isJsIndexable'), registry); |
+ enqueue(enqueuer, helpers.isJsIndexable, registry); |
} |
customElementsAnalysis.registerInstantiatedClass(cls, enqueuer); |
@@ -1383,10 +1238,10 @@ class JavaScriptBackend extends Backend { |
assert(!enqueuer.isResolutionQueue); |
if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; |
Registry registry = compiler.globalDependencies; |
- enqueue(enqueuer, getNativeInterceptorMethod, registry); |
- enqueueClass(enqueuer, jsJavaScriptObjectClass, registry); |
- enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); |
- enqueueClass(enqueuer, jsJavaScriptFunctionClass, registry); |
+ enqueue(enqueuer, helpers.getNativeInterceptorMethod, registry); |
+ enqueueClass(enqueuer, helpers.jsJavaScriptObjectClass, registry); |
+ enqueueClass(enqueuer, helpers.jsPlainJavaScriptObjectClass, registry); |
+ enqueueClass(enqueuer, helpers.jsJavaScriptFunctionClass, registry); |
needToInitializeIsolateAffinityTag = true; |
needToInitializeDispatchProperty = true; |
} |
@@ -1396,27 +1251,27 @@ class JavaScriptBackend extends Backend { |
} |
void enqueueHelpers(ResolutionEnqueuer world, Registry registry) { |
- assert(interceptorsLibrary != null); |
+ assert(helpers.interceptorsLibrary != null); |
// TODO(ngeoffray): Not enqueuing those two classes currently make |
// the compiler potentially crash. However, any reasonable program |
// will instantiate those two classes. |
- addInterceptors(jsBoolClass, world, registry); |
- addInterceptors(jsNullClass, world, registry); |
+ addInterceptors(helpers.jsBoolClass, world, registry); |
+ addInterceptors(helpers.jsNullClass, world, registry); |
if (compiler.enableTypeAssertions) { |
// Unconditionally register the helper that checks if the |
// expression in an if/while/for is a boolean. |
// TODO(ngeoffray): Should we have the resolver register those instead? |
- Element e = findHelper('boolConversionCheck'); |
+ Element e = helpers.boolConversionCheck; |
if (e != null) enqueue(world, e, registry); |
} |
if (TRACE_CALLS) { |
- traceHelper = findHelper( |
- TRACE_METHOD == 'console' ? 'consoleTraceHelper' : 'postTraceHelper'); |
+ traceHelper = TRACE_METHOD == 'console' |
+ ? helpers.consoleTraceHelper : helpers.postTraceHelper; |
assert(traceHelper != null); |
enqueueInResolution(traceHelper, registry); |
} |
- enqueueInResolution(assertUnreachableMethod, registry); |
+ enqueueInResolution(helpers.assertUnreachableMethod, registry); |
registerCheckedModeHelpers(registry); |
} |
@@ -1466,18 +1321,18 @@ class JavaScriptBackend extends Backend { |
} |
void registerBoundClosure(Enqueuer enqueuer) { |
- boundClosureClass.ensureResolved(resolution); |
+ helpers.boundClosureClass.ensureResolved(resolution); |
registerInstantiatedType( |
- boundClosureClass.rawType, |
+ helpers.boundClosureClass.rawType, |
enqueuer, |
// Precise dependency is not important here. |
compiler.globalDependencies); |
} |
void registerGetOfStaticFunction(Enqueuer enqueuer) { |
- closureClass.ensureResolved(resolution); |
+ helpers.closureClass.ensureResolved(resolution); |
registerInstantiatedType( |
- closureClass.rawType, |
+ helpers.closureClass.rawType, |
enqueuer, |
compiler.globalDependencies); |
} |
@@ -1528,7 +1383,7 @@ class JavaScriptBackend extends Backend { |
// We will neeed to add the "$is" and "$as" properties on the |
// JavaScript object prototype, so we make sure |
// [:defineProperty:] is compiled. |
- enqueue(world, findHelper('defineProperty'), registry); |
+ enqueue(world, helpers.defineProperty, registry); |
} |
} |
@@ -1602,16 +1457,18 @@ class JavaScriptBackend extends Backend { |
enqueuer.registerGetOfStaticFunction(compiler.mainFunction); |
} |
if (enqueuer.isResolutionQueue) { |
- for (String name in const [START_ROOT_ISOLATE, |
- '_currentIsolate', |
- '_callInIsolate']) { |
- Element element = find(isolateHelperLibrary, name); |
+ |
+ void enqueue(Element element) { |
enqueuer.addToWorkList(element); |
compiler.globalDependencies.registerDependency(element); |
helpersUsed.add(element.declaration); |
} |
+ |
+ enqueue(helpers.startRootIsolate); |
+ enqueue(helpers.currentIsolate); |
+ enqueue(helpers.callInIsolate); |
} else { |
- enqueuer.addToWorkList(find(isolateHelperLibrary, START_ROOT_ISOLATE)); |
+ enqueuer.addToWorkList(helpers.startRootIsolate); |
} |
} |
@@ -1627,8 +1484,8 @@ class JavaScriptBackend extends Backend { |
assert(element.name == '=='); |
ClassElement classElement = element.enclosingClass; |
return classElement == coreClasses.objectClass |
- || classElement == jsInterceptorClass |
- || classElement == jsNullClass; |
+ || classElement == helpers.jsInterceptorClass |
+ || classElement == helpers.jsNullClass; |
} |
bool methodNeedsRti(FunctionElement function) { |
@@ -1729,7 +1586,8 @@ class JavaScriptBackend extends Backend { |
if (kind == ElementKind.TYPEDEF) { |
return const WorldImpact(); |
} |
- if (element.isConstructor && element.enclosingClass == jsNullClass) { |
+ if (element.isConstructor && |
+ element.enclosingClass == helpers.jsNullClass) { |
// Work around a problem compiling JSNull's constructor. |
return const WorldImpact(); |
} |
@@ -1768,9 +1626,12 @@ class JavaScriptBackend extends Backend { |
} |
ClassElement defaultSuperclass(ClassElement element) { |
- if (isJsInterop(element)) return jsJavaScriptObjectClass; |
+ if (isJsInterop(element)) { |
+ return helpers.jsJavaScriptObjectClass; |
+ } |
// Native classes inherit from Interceptor. |
- return isNative(element) ? jsInterceptorClass : coreClasses.objectClass; |
+ return isNative(element) |
+ ? helpers.jsInterceptorClass : coreClasses.objectClass; |
} |
/** |
@@ -1883,35 +1744,35 @@ class JavaScriptBackend extends Backend { |
assert(!typeCast); // Cannot cast to void. |
if (nativeCheckOnly) return null; |
return 'voidTypeCheck'; |
- } else if (element == jsStringClass || |
+ } else if (element == helpers.jsStringClass || |
element == coreClasses.stringClass) { |
if (nativeCheckOnly) return null; |
return typeCast |
? 'stringTypeCast' |
: 'stringTypeCheck'; |
- } else if (element == jsDoubleClass || |
+ } else if (element == helpers.jsDoubleClass || |
element == coreClasses.doubleClass) { |
if (nativeCheckOnly) return null; |
return typeCast |
? 'doubleTypeCast' |
: 'doubleTypeCheck'; |
- } else if (element == jsNumberClass || |
+ } else if (element == helpers.jsNumberClass || |
element == coreClasses.numClass) { |
if (nativeCheckOnly) return null; |
return typeCast |
? 'numTypeCast' |
: 'numTypeCheck'; |
- } else if (element == jsBoolClass || |
+ } else if (element == helpers.jsBoolClass || |
element == coreClasses.boolClass) { |
if (nativeCheckOnly) return null; |
return typeCast |
? 'boolTypeCast' |
: 'boolTypeCheck'; |
- } else if (element == jsIntClass || |
+ } else if (element == helpers.jsIntClass || |
element == coreClasses.intClass || |
- element == jsUInt32Class || |
- element == jsUInt31Class || |
- element == jsPositiveIntClass) { |
+ element == helpers.jsUInt32Class || |
+ element == helpers.jsUInt31Class || |
+ element == helpers.jsPositiveIntClass) { |
if (nativeCheckOnly) return null; |
return typeCast |
? 'intTypeCast' |
@@ -1937,7 +1798,7 @@ class JavaScriptBackend extends Backend { |
: 'stringSuperTypeCheck'; |
} |
} else if ((element == coreClasses.listClass || |
- element == jsArrayClass) && |
+ element == helpers.jsArrayClass) && |
type.treatAsRaw) { |
if (nativeCheckOnly) return null; |
return typeCast |
@@ -2001,11 +1862,11 @@ class JavaScriptBackend extends Backend { |
element == coreClasses.numClass || |
element == coreClasses.intClass || |
element == coreClasses.doubleClass || |
- element == jsArrayClass || |
- element == jsMutableArrayClass || |
- element == jsExtendableArrayClass || |
- element == jsFixedArrayClass || |
- element == jsUnmodifiableArrayClass; |
+ element == helpers.jsArrayClass || |
+ element == helpers.jsMutableArrayClass || |
+ element == helpers.jsExtendableArrayClass || |
+ element == helpers.jsFixedArrayClass || |
+ element == helpers.jsUnmodifiableArrayClass; |
} |
bool mayGenerateInstanceofCheck(DartType type) { |
@@ -2019,49 +1880,48 @@ class JavaScriptBackend extends Backend { |
} |
bool isNullImplementation(ClassElement cls) { |
- return cls == jsNullClass; |
- } |
- |
- ClassElement get intImplementation => jsIntClass; |
- ClassElement get uint32Implementation => jsUInt32Class; |
- ClassElement get uint31Implementation => jsUInt31Class; |
- ClassElement get positiveIntImplementation => jsPositiveIntClass; |
- ClassElement get doubleImplementation => jsDoubleClass; |
- ClassElement get numImplementation => jsNumberClass; |
- ClassElement get stringImplementation => jsStringClass; |
- ClassElement get listImplementation => jsArrayClass; |
- ClassElement get constListImplementation => jsUnmodifiableArrayClass; |
- ClassElement get fixedListImplementation => jsFixedArrayClass; |
- ClassElement get growableListImplementation => jsExtendableArrayClass; |
- ClassElement get mapImplementation => mapLiteralClass; |
- ClassElement get constMapImplementation => constMapLiteralClass; |
- ClassElement get typeImplementation => typeLiteralClass; |
- ClassElement get boolImplementation => jsBoolClass; |
- ClassElement get nullImplementation => jsNullClass; |
+ return cls == helpers.jsNullClass; |
+ } |
+ |
+ ClassElement get intImplementation => helpers.jsIntClass; |
+ ClassElement get uint32Implementation => helpers.jsUInt32Class; |
+ ClassElement get uint31Implementation => helpers.jsUInt31Class; |
+ ClassElement get positiveIntImplementation => helpers.jsPositiveIntClass; |
+ ClassElement get doubleImplementation => helpers.jsDoubleClass; |
+ ClassElement get numImplementation => helpers.jsNumberClass; |
+ ClassElement get stringImplementation => helpers.jsStringClass; |
+ ClassElement get listImplementation => helpers.jsArrayClass; |
+ ClassElement get constListImplementation => helpers.jsUnmodifiableArrayClass; |
+ ClassElement get fixedListImplementation => helpers.jsFixedArrayClass; |
+ ClassElement get growableListImplementation => helpers.jsExtendableArrayClass; |
+ ClassElement get mapImplementation => helpers.mapLiteralClass; |
+ ClassElement get constMapImplementation => helpers.constMapLiteralClass; |
+ ClassElement get typeImplementation => helpers.typeLiteralClass; |
+ ClassElement get boolImplementation => helpers.jsBoolClass; |
+ ClassElement get nullImplementation => helpers.jsNullClass; |
void registerStaticUse(Element element, Enqueuer enqueuer) { |
- if (element == disableTreeShakingMarker) { |
+ if (element == helpers.disableTreeShakingMarker) { |
compiler.disableTypeInferenceForMirrors = true; |
isTreeShakingDisabled = true; |
- } else if (element == preserveNamesMarker) { |
+ } else if (element == helpers.preserveNamesMarker) { |
mustPreserveNames = true; |
- } else if (element == preserveMetadataMarker) { |
+ } else if (element == helpers.preserveMetadataMarker) { |
mustRetainMetadata = true; |
- } else if (element == preserveUrisMarker) { |
+ } else if (element == helpers.preserveUrisMarker) { |
if (compiler.preserveUris) mustPreserveUris = true; |
- } else if (element == preserveLibraryNamesMarker) { |
+ } else if (element == helpers.preserveLibraryNamesMarker) { |
mustRetainLibraryNames = true; |
- } else if (element == getIsolateAffinityTagMarker) { |
+ } else if (element == helpers.getIsolateAffinityTagMarker) { |
needToInitializeIsolateAffinityTag = true; |
} else if (element.isDeferredLoaderGetter) { |
// TODO(sigurdm): Create a function registerLoadLibraryAccess. |
if (compiler.loadLibraryFunction == null) { |
- compiler.loadLibraryFunction = |
- findHelper("_loadLibraryWrapper"); |
+ compiler.loadLibraryFunction = helpers.loadLibraryWrapper; |
enqueueInResolution(compiler.loadLibraryFunction, |
compiler.globalDependencies); |
} |
- } else if (element == requiresPreambleMarker) { |
+ } else if (element == helpers.requiresPreambleMarker) { |
requiresPreamble = true; |
} |
customElementsAnalysis.registerStaticUse(element, enqueuer); |
@@ -2113,39 +1973,7 @@ class JavaScriptBackend extends Backend { |
} |
void onLibraryCreated(LibraryElement library) { |
- Uri uri = library.canonicalUri; |
- if (uri == DART_JS_HELPER) { |
- jsHelperLibrary = library; |
- } else if (uri == Uris.dart_async) { |
- asyncLibrary = library; |
- } else if (uri == Uris.dart__internal) { |
- internalLibrary = library; |
- } else if (uri == DART_INTERCEPTORS) { |
- interceptorsLibrary = library; |
- } else if (uri == DART_FOREIGN_HELPER) { |
- foreignLibrary = library; |
- } else if (uri == DART_ISOLATE_HELPER) { |
- isolateHelperLibrary = library; |
- } |
- } |
- |
- void initializeHelperClasses() { |
- final List missingHelperClasses = []; |
- ClassElement lookupHelperClass(String name) { |
- ClassElement result = findHelper(name); |
- if (result == null) { |
- missingHelperClasses.add(name); |
- } |
- return result; |
- } |
- jsInvocationMirrorClass = lookupHelperClass('JSInvocationMirror'); |
- boundClosureClass = lookupHelperClass('BoundClosure'); |
- closureClass = lookupHelperClass('Closure'); |
- if (!missingHelperClasses.isEmpty) { |
- reporter.internalError(jsHelperLibrary, |
- 'dart:_js_helper library does not contain required classes: ' |
- '$missingHelperClasses'); |
- } |
+ helpers.onLibraryCreated(library); |
} |
Future onLibraryScanned(LibraryElement library, LibraryLoader loader) { |
@@ -2161,83 +1989,12 @@ class JavaScriptBackend extends Backend { |
} |
} |
}).then((_) { |
+ helpers.onLibraryScanned(library); |
Uri uri = library.canonicalUri; |
- |
- FunctionElement findMethod(String name) { |
- return find(library, name); |
- } |
- |
- ClassElement findClass(String name) { |
- return find(library, name); |
- } |
- |
- if (uri == DART_INTERCEPTORS) { |
- getInterceptorMethod = findMethod('getInterceptor'); |
- getNativeInterceptorMethod = findMethod('getNativeInterceptor'); |
- jsInterceptorClass = findClass('Interceptor'); |
- jsStringClass = findClass('JSString'); |
- jsArrayClass = findClass('JSArray'); |
- // The int class must be before the double class, because the |
- // emitter relies on this list for the order of type checks. |
- jsIntClass = findClass('JSInt'); |
- jsPositiveIntClass = findClass('JSPositiveInt'); |
- jsUInt32Class = findClass('JSUInt32'); |
- jsUInt31Class = findClass('JSUInt31'); |
- jsDoubleClass = findClass('JSDouble'); |
- jsNumberClass = findClass('JSNumber'); |
- jsNullClass = findClass('JSNull'); |
- jsBoolClass = findClass('JSBool'); |
- jsMutableArrayClass = findClass('JSMutableArray'); |
- jsFixedArrayClass = findClass('JSFixedArray'); |
- jsExtendableArrayClass = findClass('JSExtendableArray'); |
- jsUnmodifiableArrayClass = findClass('JSUnmodifiableArray'); |
- jsPlainJavaScriptObjectClass = findClass('PlainJavaScriptObject'); |
- jsJavaScriptObjectClass = findClass('JavaScriptObject'); |
- jsJavaScriptFunctionClass = findClass('JavaScriptFunction'); |
- jsUnknownJavaScriptObjectClass = findClass('UnknownJavaScriptObject'); |
- jsIndexableClass = findClass('JSIndexable'); |
- jsMutableIndexableClass = findClass('JSMutableIndexable'); |
- } else if (uri == DART_JS_HELPER) { |
- initializeHelperClasses(); |
- helpers.assertTest = findHelper('assertTest'); |
- helpers.assertThrow = findHelper('assertThrow'); |
- helpers.assertHelper = findHelper('assertHelper'); |
- assertUnreachableMethod = findHelper('assertUnreachable'); |
- |
- typeLiteralClass = findClass('TypeImpl'); |
- constMapLiteralClass = findClass('ConstantMap'); |
- typeVariableClass = findClass('TypeVariable'); |
- |
- jsIndexingBehaviorInterface = findClass('JavaScriptIndexingBehavior'); |
- |
- noSideEffectsClass = findClass('NoSideEffects'); |
- noThrowsClass = findClass('NoThrows'); |
- noInlineClass = findClass('NoInline'); |
- forceInlineClass = findClass('ForceInline'); |
- irRepresentationClass = findClass('IrRepresentation'); |
- |
- getIsolateAffinityTagMarker = findMethod('getIsolateAffinityTag'); |
- |
- requiresPreambleMarker = findMethod('requiresPreamble'); |
- } else if (uri == DART_JS_MIRRORS) { |
- disableTreeShakingMarker = find(library, 'disableTreeShaking'); |
- preserveMetadataMarker = find(library, 'preserveMetadata'); |
- preserveUrisMarker = find(library, 'preserveUris'); |
- preserveLibraryNamesMarker = find(library, 'preserveLibraryNames'); |
- } else if (uri == DART_JS_NAMES) { |
- preserveNamesMarker = find(library, 'preserveNames'); |
- } else if (uri == DART_EMBEDDED_NAMES) { |
- jsGetNameEnum = find(library, 'JsGetName'); |
- jsBuiltinEnum = find(library, 'JsBuiltin'); |
- } else if (uri == Uris.dart_html) { |
+ if (uri == Uris.dart_html) { |
htmlLibraryIsLoaded = true; |
- } else if (uri == PACKAGE_LOOKUP_MAP) { |
+ } else if (uri == LookupMapAnalysis.PACKAGE_LOOKUP_MAP) { |
lookupMapAnalysis.init(library); |
- } else if (uri == Uris.dart__native_typed_data) { |
- typedArrayClass = findClass('NativeTypedArray'); |
- typedArrayOfIntClass = findClass('NativeTypedArrayOfInt'); |
- } else if (uri == PACKAGE_JS) { |
- jsAnnotationClass = find(library, 'JS'); |
} |
annotations.onLibraryScanned(library); |
}); |
@@ -2248,74 +2005,29 @@ class JavaScriptBackend extends Backend { |
return new Future.value(); |
} |
- assert(loadedLibraries.containsLibrary(Uris.dart_core)); |
- assert(loadedLibraries.containsLibrary(DART_INTERCEPTORS)); |
- assert(loadedLibraries.containsLibrary(DART_JS_HELPER)); |
- |
- if (jsInvocationMirrorClass != null) { |
- jsInvocationMirrorClass.ensureResolved(resolution); |
- invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON); |
- } |
- |
- // [LinkedHashMap] is reexported from dart:collection and can therefore not |
- // be loaded from dart:core in [onLibraryScanned]. |
- mapLiteralClass = compiler.coreLibrary.find('LinkedHashMap'); |
- assert(invariant(compiler.coreLibrary, mapLiteralClass != null, |
- message: "Element 'LinkedHashMap' not found in 'dart:core'.")); |
+ helpers.onLibrariesLoaded(loadedLibraries); |
implementationClasses = <ClassElement, ClassElement>{}; |
- implementationClasses[coreClasses.intClass] = jsIntClass; |
- implementationClasses[coreClasses.boolClass] = jsBoolClass; |
- implementationClasses[coreClasses.numClass] = jsNumberClass; |
- implementationClasses[coreClasses.doubleClass] = jsDoubleClass; |
- implementationClasses[coreClasses.stringClass] = jsStringClass; |
- implementationClasses[coreClasses.listClass] = jsArrayClass; |
- implementationClasses[coreClasses.nullClass] = jsNullClass; |
+ implementationClasses[coreClasses.intClass] = helpers.jsIntClass; |
+ implementationClasses[coreClasses.boolClass] = helpers.jsBoolClass; |
+ implementationClasses[coreClasses.numClass] = helpers.jsNumberClass; |
+ implementationClasses[coreClasses.doubleClass] = helpers.jsDoubleClass; |
+ implementationClasses[coreClasses.stringClass] = helpers.jsStringClass; |
+ implementationClasses[coreClasses.listClass] = helpers.jsArrayClass; |
+ implementationClasses[coreClasses.nullClass] = helpers.jsNullClass; |
// These methods are overwritten with generated versions. |
- inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true); |
- |
- // TODO(kasperl): Some tests do not define the special JSArray |
- // subclasses, so we check to see if they are defined before |
- // trying to resolve them. |
- if (jsFixedArrayClass != null) { |
- jsFixedArrayClass.ensureResolved(resolution); |
- } |
- if (jsExtendableArrayClass != null) { |
- jsExtendableArrayClass.ensureResolved(resolution); |
- } |
- if (jsUnmodifiableArrayClass != null) { |
- jsUnmodifiableArrayClass.ensureResolved(resolution); |
- } |
- |
- jsIndexableClass.ensureResolved(resolution); |
- jsIndexableLength = compiler.lookupElementIn( |
- jsIndexableClass, 'length'); |
- if (jsIndexableLength != null && jsIndexableLength.isAbstractField) { |
- AbstractFieldElement element = jsIndexableLength; |
- jsIndexableLength = element.getter; |
- } |
- |
- jsArrayClass.ensureResolved(resolution); |
- jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed'); |
- jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast'); |
- jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add'); |
- |
- jsStringClass.ensureResolved(resolution); |
- jsStringSplit = compiler.lookupElementIn(jsStringClass, 'split'); |
- jsStringOperatorAdd = compiler.lookupElementIn(jsStringClass, '+'); |
- jsStringToString = compiler.lookupElementIn(jsStringClass, 'toString'); |
- |
- objectEquals = compiler.lookupElementIn(coreClasses.objectClass, '=='); |
+ inlineCache.markAsNonInlinable( |
+ helpers.getInterceptorMethod, insideLoop: true); |
specialOperatorEqClasses |
..add(coreClasses.objectClass) |
- ..add(jsInterceptorClass) |
- ..add(jsNullClass); |
+ ..add(helpers.jsInterceptorClass) |
+ ..add(helpers.jsNullClass); |
- validateInterceptorImplementsAllObjectMethods(jsInterceptorClass); |
+ validateInterceptorImplementsAllObjectMethods(helpers.jsInterceptorClass); |
// The null-interceptor must also implement *all* methods. |
- validateInterceptorImplementsAllObjectMethods(jsNullClass); |
+ validateInterceptorImplementsAllObjectMethods(helpers.jsNullClass); |
return new Future.value(); |
} |
@@ -2528,11 +2240,11 @@ class JavaScriptBackend extends Backend { |
// As we do not think about closures as classes, yet, we have to make sure |
// their superclasses are available for reflection manually. |
if (foundClosure) { |
- reflectableMembers.add(closureClass); |
+ reflectableMembers.add(helpers.closureClass); |
} |
Set<Element> closurizedMembers = compiler.resolverWorld.closurizedMembers; |
if (closurizedMembers.any(reflectableMembers.contains)) { |
- reflectableMembers.add(boundClosureClass); |
+ reflectableMembers.add(helpers.boundClosureClass); |
} |
// Add typedefs. |
reflectableMembers |
@@ -2568,7 +2280,7 @@ class JavaScriptBackend extends Backend { |
new jsAst.PropertyAccess(use2, dispatchProperty); |
List<jsAst.Expression> arguments = <jsAst.Expression>[use1, record]; |
- FunctionElement helper = findHelper('isJsIndexable'); |
+ FunctionElement helper = helpers.isJsIndexable; |
jsAst.Expression helperExpression = emitter.staticFunctionAccess(helper); |
return new jsAst.Call(helperExpression, arguments); |
} |
@@ -2581,7 +2293,7 @@ class JavaScriptBackend extends Backend { |
compiler.typedDataClass != null && |
compiler.world.isInstantiated(compiler.typedDataClass) && |
mask.satisfies(compiler.typedDataClass, compiler.world) && |
- mask.satisfies(jsIndexingBehaviorInterface, compiler.world); |
+ mask.satisfies(helpers.jsIndexingBehaviorInterface, compiler.world); |
} |
bool couldBeTypedArray(TypeMask mask) { |
@@ -2595,7 +2307,7 @@ class JavaScriptBackend extends Backend { |
intersects(mask, |
new TypeMask.subtype(compiler.typedDataClass, compiler.world)) && |
intersects(mask, |
- new TypeMask.subtype(jsIndexingBehaviorInterface, compiler.world)); |
+ new TypeMask.subtype(helpers.jsIndexingBehaviorInterface, compiler.world)); |
} |
/// Returns all static fields that are referenced through [targetsUsed]. |
@@ -2642,7 +2354,7 @@ class JavaScriptBackend extends Backend { |
if (compiler.hasIncrementalSupport) { |
// Always enable tear-off closures during incremental compilation. |
- Element e = findHelper('closureFromTearOff'); |
+ Element e = helpers.closureFromTearOff; |
if (e != null && !enqueuer.isProcessed(e)) { |
registerBackendUse(e); |
enqueuer.addToWorkList(e); |
@@ -2716,7 +2428,7 @@ class JavaScriptBackend extends Backend { |
if (!constantValue.isConstructedObject) continue; |
ObjectConstantValue value = constantValue; |
ClassElement cls = value.type.element; |
- if (cls == forceInlineClass) { |
+ if (cls == helpers.forceInlineClass) { |
hasForceInline = true; |
if (VERBOSE_OPTIMIZER_HINTS) { |
reporter.reportHintMessage( |
@@ -2725,7 +2437,7 @@ class JavaScriptBackend extends Backend { |
{'text': "Must inline"}); |
} |
inlineCache.markAsMustInline(element); |
- } else if (cls == noInlineClass) { |
+ } else if (cls == helpers.noInlineClass) { |
hasNoInline = true; |
if (VERBOSE_OPTIMIZER_HINTS) { |
reporter.reportHintMessage( |
@@ -2734,7 +2446,7 @@ class JavaScriptBackend extends Backend { |
{'text': "Cannot inline"}); |
} |
inlineCache.markAsNonInlinable(element); |
- } else if (cls == noThrowsClass) { |
+ } else if (cls == helpers.noThrowsClass) { |
hasNoThrows = true; |
if (!Elements.isStaticOrTopLevelFunction(element) && |
!element.isFactoryConstructor) { |
@@ -2749,7 +2461,7 @@ class JavaScriptBackend extends Backend { |
{'text': "Cannot throw"}); |
} |
compiler.world.registerCannotThrow(element); |
- } else if (cls == noSideEffectsClass) { |
+ } else if (cls == helpers.noSideEffectsClass) { |
hasNoSideEffects = true; |
if (VERBOSE_OPTIMIZER_HINTS) { |
reporter.reportHintMessage( |
@@ -2772,7 +2484,7 @@ class JavaScriptBackend extends Backend { |
reporter.internalError(element, |
"@NoSideEffects() should always be combined with @NoInline."); |
} |
- if (element == invokeOnMethod) { |
+ if (element == helpers.invokeOnMethod) { |
compiler.enabledInvokeOn = true; |
} |
} |
@@ -2783,13 +2495,11 @@ class JavaScriptBackend extends Backend { |
: null; |
} |
- FunctionElement helperForBadMain() => findHelper('badMain'); |
+ FunctionElement helperForBadMain() => helpers.badMain; |
- FunctionElement helperForMissingMain() => findHelper('missingMain'); |
+ FunctionElement helperForMissingMain() => helpers.missingMain; |
- FunctionElement helperForMainArity() { |
- return findHelper('mainHasTooManyParameters'); |
- } |
+ FunctionElement helperForMainArity() => helpers.mainHasTooManyParameters; |
void forgetElement(Element element) { |
constants.forgetElement(element); |
@@ -2964,7 +2674,7 @@ class Annotations { |
// TODO(floitsch): restrict to elements from the test directory. |
return true; |
} |
- return _hasAnnotation(element, backend.noInlineClass); |
+ return _hasAnnotation(element, backend.helpers.noInlineClass); |
} |
/// Returns `true` if parameter and returns types should be trusted for |