Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: pkg/compiler/lib/src/js_backend/backend.dart

Issue 1413213004: Move remaining helpers to BackendHelpers (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/type_propagation.dart ('k') | pkg/compiler/lib/src/js_backend/backend_helpers.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698