| 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 241eb978d7536d4fb00e8ce4278f4b7e80796a1e..39b46255c1595f00ae9b4156af85d7b1f6a5b82e 100644
|
| --- a/pkg/compiler/lib/src/js_backend/backend.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/backend.dart
|
| @@ -630,7 +630,7 @@ class JavaScriptBackend extends Backend {
|
|
|
| JavaScriptConstantTask constantCompilerTask;
|
|
|
| - JavaScriptResolutionCallbacks resolutionCallbacks;
|
| + JavaScriptImpactTransformer impactTransformer;
|
|
|
| PatchResolverTask patchResolverTask;
|
|
|
| @@ -669,7 +669,7 @@ class JavaScriptBackend extends Backend {
|
|
|
| noSuchMethodRegistry = new NoSuchMethodRegistry(this);
|
| constantCompilerTask = new JavaScriptConstantTask(compiler);
|
| - resolutionCallbacks = new JavaScriptResolutionCallbacks(this);
|
| + impactTransformer = new JavaScriptImpactTransformer(this);
|
| patchResolverTask = new PatchResolverTask(compiler);
|
| functionCompiler = compiler.useCpsIr
|
| ? new CpsFunctionCompiler(
|
| @@ -1449,7 +1449,7 @@ class JavaScriptBackend extends Backend {
|
|
|
| /// Call during codegen if an instance of [closure] is being created.
|
| void registerInstantiatedClosure(LocalFunctionElement closure,
|
| - CodegenRegistry registry) {
|
| + Registry registry) {
|
| if (methodNeedsRti(closure)) {
|
| registerComputeSignature(compiler.enqueuer.codegen, registry);
|
| }
|
| @@ -1712,7 +1712,7 @@ class JavaScriptBackend extends Backend {
|
| if (compiler.elementHasCompileTimeError(element)) {
|
| generatedCode[element] = jsAst.js(
|
| "function () { throw new Error('Compile time error in $element') }");
|
| - return const WorldImpact();
|
| + return const CodegenImpact();
|
| }
|
| var kind = element.kind;
|
| if (kind == ElementKind.TYPEDEF) {
|
| @@ -1720,7 +1720,7 @@ class JavaScriptBackend extends Backend {
|
| }
|
| if (element.isConstructor && element.enclosingClass == jsNullClass) {
|
| // Work around a problem compiling JSNull's constructor.
|
| - return const WorldImpact();
|
| + return const CodegenImpact();
|
| }
|
| if (kind.category == ElementCategory.VARIABLE) {
|
| ConstantValue initialValue =
|
| @@ -1732,7 +1732,8 @@ class JavaScriptBackend extends Backend {
|
| // variables. For instance variables, we may need to generate
|
| // the checked setter.
|
| if (Elements.isStaticOrTopLevel(element)) {
|
| - return const WorldImpact();
|
| + return impactTransformer.transformCodegenImpact(
|
| + work.registry.worldImpact);
|
| }
|
| } else {
|
| // If the constant-handler was not able to produce a result we have to
|
| @@ -1745,7 +1746,7 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| generatedCode[element] = functionCompiler.compile(work);
|
| - return const WorldImpact();
|
| + return impactTransformer.transformCodegenImpact(work.registry.worldImpact);
|
| }
|
|
|
| native.NativeEnqueuer nativeResolutionEnqueuer(Enqueuer world) {
|
| @@ -2650,20 +2651,12 @@ class JavaScriptBackend extends Backend {
|
| reporter.log('Retaining metadata.');
|
|
|
| compiler.libraryLoader.libraries.forEach(retainMetadataOf);
|
| - if (enqueuer.isResolutionQueue) {
|
| - for (Dependency dependency in metadataConstants) {
|
| - registerCompileTimeConstant(
|
| - dependency.constant,
|
| - new EagerRegistry(compiler,
|
| - dependency.annotatedElement.analyzableElement.treeElements));
|
| - }
|
| - } else {
|
| - for (Dependency dependency in metadataConstants) {
|
| - registerCompileTimeConstant(
|
| - dependency.constant,
|
| - new CodegenRegistry(compiler,
|
| - dependency.annotatedElement.analyzableElement.treeElements));
|
| - }
|
| + for (Dependency dependency in metadataConstants) {
|
| + registerCompileTimeConstant(
|
| + dependency.constant,
|
| + new EagerRegistry('EagerRegistry for ${dependency}', enqueuer));
|
| + }
|
| + if (!enqueuer.isResolutionQueue) {
|
| metadataConstants.clear();
|
| }
|
| }
|
| @@ -2981,14 +2974,15 @@ class Annotations {
|
| }
|
| }
|
|
|
| -class JavaScriptResolutionCallbacks extends ResolutionCallbacks {
|
| +class JavaScriptImpactTransformer extends ImpactTransformer {
|
| final JavaScriptBackend backend;
|
|
|
| - JavaScriptResolutionCallbacks(this.backend);
|
| + JavaScriptImpactTransformer(this.backend);
|
|
|
| BackendImpacts get impacts => backend.impacts;
|
|
|
| - WorldImpact transformImpact(ResolutionImpact worldImpact) {
|
| + @override
|
| + WorldImpact transformResolutionImpact(ResolutionImpact worldImpact) {
|
| TransformedWorldImpact transformed =
|
| new TransformedWorldImpact(worldImpact);
|
| for (Feature feature in worldImpact.features) {
|
| @@ -3211,6 +3205,95 @@ class JavaScriptResolutionCallbacks extends ResolutionCallbacks {
|
| registerBackendImpact(transformed, impacts.nativeTypeCheck);
|
| }
|
| }
|
| +
|
| + @override
|
| + WorldImpact transformCodegenImpact(CodegenImpact impact) {
|
| + EagerRegistry registry = impact.registry;
|
| + Enqueuer world = registry.world;
|
| +
|
| + for (InterfaceType type in impact.instantiatedTypes) {
|
| + backend.registerInstantiatedType(type, world, registry);
|
| + }
|
| +
|
| + for (Element element in impact.staticUses) {
|
| + world.registerStaticUse(element);
|
| + }
|
| +
|
| + for (UniverseSelector selector in impact.dynamicInvocations) {
|
| + world.registerDynamicInvocation(selector);
|
| + }
|
| +
|
| + for (UniverseSelector selector in impact.dynamicGetters) {
|
| + world.registerDynamicGetter(selector);
|
| + }
|
| +
|
| + for (UniverseSelector selector in impact.dynamicSetters) {
|
| + world.registerDynamicSetter(selector);
|
| + }
|
| +
|
| + for (UniverseSelector selector in impact.dynamicSetters) {
|
| + world.registerDynamicSetter(selector);
|
| + }
|
| +
|
| + for (Element element in impact.getterForSuperElements) {
|
| + world.registerGetterForSuperMethod(element);
|
| + }
|
| +
|
| + for (Element element in impact.fieldGetters) {
|
| + world.registerFieldGetter(element);
|
| + }
|
| +
|
| + for (Element element in impact.fieldSetters) {
|
| + world.registerFieldSetter(element);
|
| + }
|
| +
|
| + for (DartType type in impact.isChecks) {
|
| + world.registerIsCheck(type);
|
| + backend.registerIsCheckForCodegen(type, world, registry);
|
| + }
|
| +
|
| + for (ConstantValue constant in impact.compileTimeConstants) {
|
| + backend.registerCompileTimeConstant(constant, registry);
|
| + backend.addCompileTimeConstantForEmission(constant);
|
| + }
|
| +
|
| + for (Pair<DartType, DartType> check in
|
| + impact.typeVariableBoundsSubtypeChecks) {
|
| + backend.registerTypeVariableBoundsSubtypeCheck(check.a, check.b);
|
| + }
|
| +
|
| + for (LocalFunctionElement element in impact.closures) {
|
| + backend.registerInstantiatedClosure(element, registry);
|
| + }
|
| +
|
| + for (Element element in impact.closurizedFunctions) {
|
| + world.registerGetOfStaticFunction(element);
|
| + }
|
| +
|
| + for (String name in impact.constSymbols) {
|
| + backend.registerConstSymbol(name);
|
| + }
|
| +
|
| + for (Set<ClassElement> classes in impact.specializedGetInterceptors) {
|
| + backend.registerSpecializedGetInterceptor(classes);
|
| + }
|
| +
|
| + if (impact.usesInterceptor) {
|
| + backend.registerUseInterceptor(world);
|
| + }
|
| +
|
| + for (ClassElement element in impact.typeConstants) {
|
| + backend.customElementsAnalysis.registerTypeConstant(element, world);
|
| + backend.lookupMapAnalysis.registerTypeConstant(element);
|
| + }
|
| +
|
| + for (FunctionElement element in impact.asyncMarkers) {
|
| + backend.registerAsyncMarker(element, world, registry);
|
| + }
|
| +
|
| + // TODO(johnniwinther): Remove eager registration.
|
| + return const WorldImpact();
|
| + }
|
| }
|
|
|
| /// Records that [constant] is used by the element behind [registry].
|
|
|