Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| index dd9a80ca73d2606b22414a5a0d675100eeecb51e..0300b8e83a9d7384f35eee88f8216efd30401a24 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
| @@ -351,12 +351,17 @@ class JavaScriptBackend extends Backend { |
| return constantCompilerTask.jsConstantCompiler; |
| } |
| - // TODO(karlklose): split into findHelperFunction and findHelperClass and |
| + // TODO(karlklose): Split into findHelperFunction and findHelperClass and |
| // add a check that the element has the expected kind. |
| - Element findHelper(String name) |
| - => jsHelperLibrary.findLocal(name); |
| - Element findInterceptor(String name) |
| - => interceptorsLibrary.findLocal(name); |
| + Element findHelper(String name) => find(jsHelperLibrary, name); |
| + Element findInterceptor(String name) => find(interceptorsLibrary, name); |
| + |
| + Element find(LibraryElement library, String name) { |
| + Element element = library.findLocal(name); |
| + assert(invariant(library, element != null, |
| + message: "Element '$name' not found in '${library.canonicalUri}'.")); |
| + return element; |
| + } |
| bool isForeign(Element element) => element.library == foreignLibrary; |
| @@ -663,13 +668,13 @@ class JavaScriptBackend extends Backend { |
| || cls == compiler.numClass) { |
| // The backend will try to optimize number operations and use the |
| // `iae` helper directly. |
| - enqueue(enqueuer, findHelper('iae'), registry); |
| + enqueue(enqueuer, find(jsHelperLibrary, 'iae'), registry); |
|
karlklose
2014/07/03 08:31:15
Why did you change all the calls to findHelper? I
Johnni Winther
2014/07/03 09:23:25
Changed to findHelper.
|
| } else if (cls == compiler.listClass |
| || cls == compiler.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, find(jsHelperLibrary, 'ioore'), registry); |
| + enqueue(enqueuer, find(jsHelperLibrary, 'iae'), registry); |
| } else if (cls == compiler.functionClass) { |
| enqueueClass(enqueuer, closureClass, registry); |
| } else if (cls == compiler.mapClass) { |
| @@ -711,7 +716,7 @@ class JavaScriptBackend extends Backend { |
| } |
| } |
| if (cls == closureClass) { |
| - enqueue(enqueuer, findHelper('closureFromTearOff'), registry); |
| + enqueue(enqueuer, find(jsHelperLibrary, 'closureFromTearOff'), registry); |
| } |
| ClassElement result = null; |
| if (cls == compiler.stringClass || cls == jsStringClass) { |
| @@ -754,8 +759,7 @@ class JavaScriptBackend extends Backend { |
| // 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, findInterceptor('dispatchPropertyName'), registry); |
| + enqueue(enqueuer, find(jsHelperLibrary, 'isJsIndexable'), registry); |
| } |
| customElementsAnalysis.registerInstantiatedClass(cls, enqueuer); |
| @@ -786,11 +790,11 @@ class JavaScriptBackend extends Backend { |
| // 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 = find(jsHelperLibrary, 'boolConversionCheck'); |
| if (e != null) enqueue(world, e, registry); |
| } |
| if (TRACE_CALLS) { |
| - traceHelper = findHelper('traceHelper'); |
| + traceHelper = find(jsHelperLibrary, 'traceHelper'); |
| assert(traceHelper != null); |
| enqueueInResolution(traceHelper, registry); |
| } |
| @@ -881,7 +885,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, find(jsHelperLibrary, 'defineProperty'), registry); |
| } |
| } |
| @@ -906,12 +910,12 @@ class JavaScriptBackend extends Backend { |
| for (String name in const [START_ROOT_ISOLATE, |
| '_currentIsolate', |
| '_callInIsolate']) { |
| - Element element = isolateHelperLibrary.find(name); |
| + Element element = find(isolateHelperLibrary, name); |
| enqueuer.addToWorkList(element); |
| compiler.globalDependencies.registerDependency(element); |
| } |
| } else { |
| - enqueuer.addToWorkList(isolateHelperLibrary.find(START_ROOT_ISOLATE)); |
| + enqueuer.addToWorkList(find(isolateHelperLibrary, START_ROOT_ISOLATE)); |
| } |
| } |
| @@ -1278,115 +1282,115 @@ class JavaScriptBackend extends Backend { |
| } |
| Element getExceptionUnwrapper() { |
| - return findHelper('unwrapException'); |
| + return find(jsHelperLibrary, 'unwrapException'); |
| } |
| Element getThrowRuntimeError() { |
| - return findHelper('throwRuntimeError'); |
| + return find(jsHelperLibrary, 'throwRuntimeError'); |
| } |
| Element getThrowTypeError() { |
| - return findHelper('throwTypeError'); |
| + return find(jsHelperLibrary, 'throwTypeError'); |
| } |
| Element getThrowAbstractClassInstantiationError() { |
| - return findHelper('throwAbstractClassInstantiationError'); |
| + return find(jsHelperLibrary, 'throwAbstractClassInstantiationError'); |
| } |
| Element getStringInterpolationHelper() { |
| - return findHelper('S'); |
| + return find(jsHelperLibrary, 'S'); |
| } |
| Element getWrapExceptionHelper() { |
| - return findHelper(r'wrapException'); |
| + return find(jsHelperLibrary, r'wrapException'); |
| } |
| Element getThrowExpressionHelper() { |
| - return findHelper('throwExpression'); |
| + return find(jsHelperLibrary, 'throwExpression'); |
| } |
| Element getClosureConverter() { |
| - return findHelper('convertDartClosureToJS'); |
| + return find(jsHelperLibrary, 'convertDartClosureToJS'); |
| } |
| Element getTraceFromException() { |
| - return findHelper('getTraceFromException'); |
| + return find(jsHelperLibrary, 'getTraceFromException'); |
| } |
| Element getSetRuntimeTypeInfo() { |
| - return findHelper('setRuntimeTypeInfo'); |
| + return find(jsHelperLibrary, 'setRuntimeTypeInfo'); |
| } |
| Element getGetRuntimeTypeInfo() { |
| - return findHelper('getRuntimeTypeInfo'); |
| + return find(jsHelperLibrary, 'getRuntimeTypeInfo'); |
| } |
| Element getGetTypeArgumentByIndex() { |
| - return findHelper('getTypeArgumentByIndex'); |
| + return find(jsHelperLibrary, 'getTypeArgumentByIndex'); |
| } |
| Element getCopyTypeArguments() { |
| - return findHelper('copyTypeArguments'); |
| + return find(jsHelperLibrary, 'copyTypeArguments'); |
| } |
| Element getComputeSignature() { |
| - return findHelper('computeSignature'); |
| + return find(jsHelperLibrary, 'computeSignature'); |
| } |
| Element getGetRuntimeTypeArguments() { |
| - return findHelper('getRuntimeTypeArguments'); |
| + return find(jsHelperLibrary, 'getRuntimeTypeArguments'); |
| } |
| Element getGetRuntimeTypeArgument() { |
| - return findHelper('getRuntimeTypeArgument'); |
| + return find(jsHelperLibrary, 'getRuntimeTypeArgument'); |
| } |
| Element getRuntimeTypeToString() { |
| - return findHelper('runtimeTypeToString'); |
| + return find(jsHelperLibrary, 'runtimeTypeToString'); |
| } |
| Element getAssertIsSubtype() { |
| - return findHelper('assertIsSubtype'); |
| + return find(jsHelperLibrary, 'assertIsSubtype'); |
| } |
| Element getCheckSubtype() { |
| - return findHelper('checkSubtype'); |
| + return find(jsHelperLibrary, 'checkSubtype'); |
| } |
| Element getAssertSubtype() { |
| - return findHelper('assertSubtype'); |
| + return find(jsHelperLibrary, 'assertSubtype'); |
| } |
| Element getCheckSubtypeOfRuntimeType() { |
| - return findHelper('checkSubtypeOfRuntimeType'); |
| + return find(jsHelperLibrary, 'checkSubtypeOfRuntimeType'); |
| } |
| Element getCheckDeferredIsLoaded() { |
| - return findHelper('checkDeferredIsLoaded'); |
| + return find(jsHelperLibrary, 'checkDeferredIsLoaded'); |
| } |
| Element getAssertSubtypeOfRuntimeType() { |
| - return findHelper('assertSubtypeOfRuntimeType'); |
| + return find(jsHelperLibrary, 'assertSubtypeOfRuntimeType'); |
| } |
| Element getThrowNoSuchMethod() { |
| - return findHelper('throwNoSuchMethod'); |
| + return find(jsHelperLibrary, 'throwNoSuchMethod'); |
| } |
| Element getCreateRuntimeType() { |
| - return findHelper('createRuntimeType'); |
| + return find(jsHelperLibrary, 'createRuntimeType'); |
| } |
| Element getFallThroughError() { |
| - return findHelper("getFallThroughError"); |
| + return find(jsHelperLibrary, "getFallThroughError"); |
| } |
| Element getCreateInvocationMirror() { |
| - return findHelper(Compiler.CREATE_INVOCATION_MIRROR); |
| + return find(jsHelperLibrary, Compiler.CREATE_INVOCATION_MIRROR); |
| } |
| Element getCyclicThrowHelper() { |
| - return findHelper("throwCyclicInit"); |
| + return find(jsHelperLibrary, "throwCyclicInit"); |
| } |
| bool isNullImplementation(ClassElement cls) { |
| @@ -1425,7 +1429,7 @@ class JavaScriptBackend extends Backend { |
| // TODO(sigurdm): Create a function registerLoadLibraryAccess. |
| if (compiler.loadLibraryFunction == null) { |
| compiler.loadLibraryFunction = |
| - findHelper("_loadLibraryWrapper"); |
| + find(jsHelperLibrary, "_loadLibraryWrapper"); |
| enqueueInResolution(compiler.loadLibraryFunction, |
| compiler.globalDependencies); |
| } |
| @@ -1489,7 +1493,7 @@ class JavaScriptBackend extends Backend { |
| void initializeHelperClasses() { |
| final List missingHelperClasses = []; |
| ClassElement lookupHelperClass(String name) { |
| - ClassElement result = jsHelperLibrary.find(name); |
| + ClassElement result = find(jsHelperLibrary, name); |
| if (result == null) { |
| missingHelperClasses.add(name); |
| } |
| @@ -1511,15 +1515,15 @@ class JavaScriptBackend extends Backend { |
| // TODO(johnniwinther): Assert that the elements are found. |
| VariableElement findVariable(String name) { |
| - return library.find(name); |
| + return find(library, name); |
| } |
| FunctionElement findMethod(String name) { |
| - return library.find(name); |
| + return find(library, name); |
| } |
| ClassElement findClass(String name) { |
| - return library.find(name); |
| + return find(library, name); |
| } |
| if (uri == DART_INTERCEPTORS) { |
| @@ -1553,7 +1557,7 @@ class JavaScriptBackend extends Backend { |
| jsMutableIndexableClass = findClass('JSMutableIndexable'); |
| } else if (uri == DART_JS_HELPER) { |
| initializeHelperClasses(); |
| - assertMethod = jsHelperLibrary.find('assertHelper'); |
| + assertMethod = find(jsHelperLibrary, 'assertHelper'); |
| typeLiteralClass = findClass('TypeImpl'); |
| constMapLiteralClass = findClass('ConstantMap'); |
| @@ -1566,12 +1570,12 @@ class JavaScriptBackend extends Backend { |
| noInlineClass = findClass('NoInline'); |
| irRepresentationClass = findClass('IrRepresentation'); |
| - getIsolateAffinityTagMarker = library.find('getIsolateAffinityTag'); |
| + getIsolateAffinityTagMarker = find(library, 'getIsolateAffinityTag'); |
| } else if (uri == DART_JS_MIRRORS) { |
| - disableTreeShakingMarker = library.find('disableTreeShaking'); |
| - preserveMetadataMarker = library.find('preserveMetadata'); |
| + disableTreeShakingMarker = find(library, 'disableTreeShaking'); |
| + preserveMetadataMarker = find(library, 'preserveMetadata'); |
| } else if (uri == DART_JS_NAMES) { |
| - preserveNamesMarker = library.find('preserveNames'); |
| + preserveNamesMarker = find(library, 'preserveNames'); |
| } |
| }); |
| } |
| @@ -1593,6 +1597,8 @@ class JavaScriptBackend extends Backend { |
| // [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'.")); |
| implementationClasses = <ClassElement, ClassElement>{}; |
| implementationClasses[compiler.intClass] = jsIntClass; |
| @@ -1763,7 +1769,7 @@ class JavaScriptBackend extends Backend { |
| use2, js(dispatchPropertyName)); |
| List<jsAst.Expression> arguments = <jsAst.Expression>[use1, record]; |
| - FunctionElement helper = findHelper('isJsIndexable'); |
| + FunctionElement helper = find(jsHelperLibrary, 'isJsIndexable'); |
| jsAst.Expression helperExpression = namer.elementAccess(helper); |
| return new jsAst.Call(helperExpression, arguments); |
| } |
| @@ -2020,14 +2026,15 @@ class JavaScriptionResolutionCallbacks extends ResolutionCallbacks { |
| } |
| if (type is FunctionType) { |
| registerBackendStaticInvocation( |
| - backend.findHelper('functionTypeTestMetaHelper'), registry); |
| + backend.find(backend.jsHelperLibrary, 'functionTypeTestMetaHelper'), |
| + registry); |
| } |
| if (type.element != null && type.element.isNative) { |
| // We will neeed to add the "$is" and "$as" properties on the |
| // JavaScript object prototype, so we make sure |
| // [:defineProperty:] is compiled. |
| registerBackendStaticInvocation( |
| - backend.findHelper('defineProperty'), registry); |
| + backend.find(backend.jsHelperLibrary, 'defineProperty'), registry); |
| } |
| } |
| @@ -2083,7 +2090,7 @@ class JavaScriptionResolutionCallbacks extends ResolutionCallbacks { |
| void onConstantMap(Registry registry) { |
| assert(registry.isForResolution); |
| void enqueue(String name) { |
| - Element e = backend.findHelper(name); |
| + Element e = backend.find(backend.jsHelperLibrary, name); |
| registerBackendInstantiation(e, registry); |
| } |