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

Side by Side Diff: pkg/compiler/lib/src/js_backend/backend.dart

Issue 2728393005: Extract CodegenImpactTransformer from ImpactTransformer (Closed)
Patch Set: Updated cf. comments. Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library js_backend.backend; 5 library js_backend.backend;
6 6
7 import 'dart:async' show Future; 7 import 'dart:async' show Future;
8 8
9 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; 9 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
10 10
11 import '../common.dart'; 11 import '../common.dart';
12 import '../common/backend_api.dart' 12 import '../common/backend_api.dart'
13 show BackendClasses, ForeignResolver, NativeRegistry; 13 show BackendClasses, ForeignResolver, NativeRegistry, ImpactTransformer;
14 import '../common/codegen.dart' show CodegenImpact, CodegenWorkItem; 14 import '../common/codegen.dart' show CodegenImpact, CodegenWorkItem;
15 import '../common/names.dart' show Uris; 15 import '../common/names.dart' show Uris;
16 import '../common/resolution.dart' 16 import '../common/resolution.dart'
17 show Frontend, Resolution, ResolutionImpact, Target; 17 show Frontend, Resolution, ResolutionImpact, Target;
18 import '../common/tasks.dart' show CompilerTask; 18 import '../common/tasks.dart' show CompilerTask;
19 import '../compiler.dart' show Compiler; 19 import '../compiler.dart' show Compiler;
20 import '../constants/constant_system.dart'; 20 import '../constants/constant_system.dart';
21 import '../constants/expressions.dart'; 21 import '../constants/expressions.dart';
22 import '../constants/values.dart'; 22 import '../constants/values.dart';
23 import '../common_elements.dart' show CommonElements, ElementEnvironment; 23 import '../common_elements.dart' show CommonElements, ElementEnvironment;
24 import '../deferred_load.dart' show DeferredLoadTask; 24 import '../deferred_load.dart' show DeferredLoadTask;
25 import '../dump_info.dart' show DumpInfoTask; 25 import '../dump_info.dart' show DumpInfoTask;
26 import '../elements/elements.dart'; 26 import '../elements/elements.dart';
27 import '../elements/entities.dart'; 27 import '../elements/entities.dart';
28 import '../elements/resolution_types.dart'; 28 import '../elements/resolution_types.dart';
29 import '../elements/types.dart'; 29 import '../elements/types.dart';
30 import '../enqueue.dart' 30 import '../enqueue.dart'
31 show 31 show
32 DirectEnqueuerStrategy, 32 DirectEnqueuerStrategy,
33 Enqueuer, 33 Enqueuer,
34 EnqueuerListener,
35 EnqueueTask, 34 EnqueueTask,
36 ResolutionEnqueuer, 35 ResolutionEnqueuer,
37 ResolutionWorkItemBuilder, 36 ResolutionWorkItemBuilder,
38 TreeShakingEnqueuerStrategy; 37 TreeShakingEnqueuerStrategy;
39 import '../io/multi_information.dart' show MultiSourceInformationStrategy; 38 import '../io/multi_information.dart' show MultiSourceInformationStrategy;
40 import '../io/position_information.dart' show PositionSourceInformationStrategy; 39 import '../io/position_information.dart' show PositionSourceInformationStrategy;
41 import '../io/source_information.dart' show SourceInformationStrategy; 40 import '../io/source_information.dart' show SourceInformationStrategy;
42 import '../io/start_end_information.dart' 41 import '../io/start_end_information.dart'
43 show StartEndSourceInformationStrategy; 42 show StartEndSourceInformationStrategy;
44 import '../js/js.dart' as jsAst; 43 import '../js/js.dart' as jsAst;
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 MirrorsAnalysis mirrorsAnalysis; 414 MirrorsAnalysis mirrorsAnalysis;
416 415
417 /// Builds kernel representation for the program. 416 /// Builds kernel representation for the program.
418 KernelTask kernelTask; 417 KernelTask kernelTask;
419 418
420 /// The compiler task responsible for the compilation of constants for both 419 /// The compiler task responsible for the compilation of constants for both
421 /// the frontend and the backend. 420 /// the frontend and the backend.
422 final JavaScriptConstantTask constantCompilerTask; 421 final JavaScriptConstantTask constantCompilerTask;
423 422
424 /// Backend transformation methods for the world impacts. 423 /// Backend transformation methods for the world impacts.
425 JavaScriptImpactTransformer impactTransformer; 424 ImpactTransformer impactTransformer;
425
426 CodegenImpactTransformer _codegenImpactTransformer;
426 427
427 PatchResolverTask patchResolverTask; 428 PatchResolverTask patchResolverTask;
428 429
429 /// The strategy used for collecting and emitting source information. 430 /// The strategy used for collecting and emitting source information.
430 SourceInformationStrategy sourceInformationStrategy; 431 SourceInformationStrategy sourceInformationStrategy;
431 432
432 /// Interface for serialization of backend specific data. 433 /// Interface for serialization of backend specific data.
433 JavaScriptBackendSerialization serialization; 434 JavaScriptBackendSerialization serialization;
434 435
435 NativeDataImpl _nativeData; 436 NativeDataImpl _nativeData;
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 nativeClassData); 540 nativeClassData);
540 jsInteropAnalysis = new JsInteropAnalysis(this); 541 jsInteropAnalysis = new JsInteropAnalysis(this);
541 mirrorsAnalysis = new MirrorsAnalysis(this, compiler.resolution); 542 mirrorsAnalysis = new MirrorsAnalysis(this, compiler.resolution);
542 lookupMapLibraryAccess = 543 lookupMapLibraryAccess =
543 new LookupMapLibraryAccess(reporter, compiler.elementEnvironment); 544 new LookupMapLibraryAccess(reporter, compiler.elementEnvironment);
544 lookupMapAnalysis = new LookupMapAnalysis(this, compiler.options, reporter, 545 lookupMapAnalysis = new LookupMapAnalysis(this, compiler.options, reporter,
545 compiler.elementEnvironment, commonElements, backendClasses); 546 compiler.elementEnvironment, commonElements, backendClasses);
546 547
547 noSuchMethodRegistry = new NoSuchMethodRegistry(this); 548 noSuchMethodRegistry = new NoSuchMethodRegistry(this);
548 kernelTask = new KernelTask(compiler); 549 kernelTask = new KernelTask(compiler);
549 impactTransformer = new JavaScriptImpactTransformer(this); 550 impactTransformer = new JavaScriptImpactTransformer(
551 compiler.options,
552 compiler.resolution,
553 compiler.elementEnvironment,
554 commonElements,
555 impacts,
556 nativeClassData,
557 nativeResolutionEnqueuer,
558 backendUsageBuilder,
559 mirrorsData,
560 customElementsResolutionAnalysis,
561 rtiNeedBuilder);
550 patchResolverTask = new PatchResolverTask(compiler); 562 patchResolverTask = new PatchResolverTask(compiler);
551 functionCompiler = 563 functionCompiler =
552 new SsaFunctionCompiler(this, sourceInformationStrategy, useKernel); 564 new SsaFunctionCompiler(this, sourceInformationStrategy, useKernel);
553 serialization = 565 serialization =
554 new JavaScriptBackendSerialization(nativeClassData, nativeData); 566 new JavaScriptBackendSerialization(nativeClassData, nativeData);
555 _interceptorDataBuilder = new InterceptorDataBuilderImpl( 567 _interceptorDataBuilder = new InterceptorDataBuilderImpl(
556 nativeClassData, helpers, commonElements, compiler.resolution); 568 nativeClassData, helpers, commonElements, compiler.resolution);
557 } 569 }
558 570
559 /// The [ConstantSystem] used to interpret compile-time constants for this 571 /// The [ConstantSystem] used to interpret compile-time constants for this
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
1008 ConstantValue initialValue = constants.getConstantValue(constant); 1020 ConstantValue initialValue = constants.getConstantValue(constant);
1009 if (initialValue != null) { 1021 if (initialValue != null) {
1010 computeImpactForCompileTimeConstant( 1022 computeImpactForCompileTimeConstant(
1011 initialValue, work.registry.worldImpact, 1023 initialValue, work.registry.worldImpact,
1012 forResolution: false); 1024 forResolution: false);
1013 addCompileTimeConstantForEmission(initialValue); 1025 addCompileTimeConstantForEmission(initialValue);
1014 // We don't need to generate code for static or top-level 1026 // We don't need to generate code for static or top-level
1015 // variables. For instance variables, we may need to generate 1027 // variables. For instance variables, we may need to generate
1016 // the checked setter. 1028 // the checked setter.
1017 if (Elements.isStaticOrTopLevel(element)) { 1029 if (Elements.isStaticOrTopLevel(element)) {
1018 return impactTransformer 1030 return _codegenImpactTransformer
1019 .transformCodegenImpact(work.registry.worldImpact); 1031 .transformCodegenImpact(work.registry.worldImpact);
1020 } 1032 }
1021 } else { 1033 } else {
1022 assert(invariant( 1034 assert(invariant(
1023 variableElement, 1035 variableElement,
1024 variableElement.isInstanceMember || 1036 variableElement.isInstanceMember ||
1025 constant.isImplicit || 1037 constant.isImplicit ||
1026 constant.isPotential, 1038 constant.isPotential,
1027 message: "Constant expression without value: " 1039 message: "Constant expression without value: "
1028 "${constant.toStructuredText()}.")); 1040 "${constant.toStructuredText()}."));
1029 } 1041 }
1030 } else { 1042 } else {
1031 // If the constant-handler was not able to produce a result we have to 1043 // If the constant-handler was not able to produce a result we have to
1032 // go through the builder (below) to generate the lazy initializer for 1044 // go through the builder (below) to generate the lazy initializer for
1033 // the static variable. 1045 // the static variable.
1034 // We also need to register the use of the cyclic-error helper. 1046 // We also need to register the use of the cyclic-error helper.
1035 work.registry.worldImpact.registerStaticUse(new StaticUse.staticInvoke( 1047 work.registry.worldImpact.registerStaticUse(new StaticUse.staticInvoke(
1036 helpers.cyclicThrowHelper, CallStructure.ONE_ARG)); 1048 helpers.cyclicThrowHelper, CallStructure.ONE_ARG));
1037 } 1049 }
1038 } 1050 }
1039 1051
1040 jsAst.Fun function = functionCompiler.compile(work, _closedWorld); 1052 jsAst.Fun function = functionCompiler.compile(work, _closedWorld);
1041 if (function.sourceInformation == null) { 1053 if (function.sourceInformation == null) {
1042 function = function.withSourceInformation( 1054 function = function.withSourceInformation(
1043 sourceInformationStrategy.buildSourceMappedMarker()); 1055 sourceInformationStrategy.buildSourceMappedMarker());
1044 } 1056 }
1045 generatedCode[element] = function; 1057 generatedCode[element] = function;
1046 WorldImpact worldImpact = 1058 WorldImpact worldImpact = _codegenImpactTransformer
1047 impactTransformer.transformCodegenImpact(work.registry.worldImpact); 1059 .transformCodegenImpact(work.registry.worldImpact);
1048 compiler.dumpInfoTask.registerImpact(element, worldImpact); 1060 compiler.dumpInfoTask.registerImpact(element, worldImpact);
1049 return worldImpact; 1061 return worldImpact;
1050 } 1062 }
1051 1063
1052 native.NativeEnqueuer get nativeResolutionEnqueuer => 1064 native.NativeEnqueuer get nativeResolutionEnqueuer =>
1053 _nativeResolutionEnqueuer; 1065 _nativeResolutionEnqueuer;
1054 1066
1055 native.NativeEnqueuer get nativeCodegenEnqueuer => _nativeCodegenEnqueuer; 1067 native.NativeEnqueuer get nativeCodegenEnqueuer => _nativeCodegenEnqueuer;
1056 1068
1057 ClassElement defaultSuperclass(ClassElement element) { 1069 ClassElement defaultSuperclass(ClassElement element) {
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 _closedWorldCache = value; 1241 _closedWorldCache = value;
1230 } 1242 }
1231 1243
1232 /// Called when the compiler starts running the codegen enqueuer. The 1244 /// Called when the compiler starts running the codegen enqueuer. The
1233 /// [WorldImpact] of enabled backend features is returned. 1245 /// [WorldImpact] of enabled backend features is returned.
1234 WorldImpact onCodegenStart( 1246 WorldImpact onCodegenStart(
1235 ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder) { 1247 ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder) {
1236 _closedWorld = closedWorld; 1248 _closedWorld = closedWorld;
1237 _namer = determineNamer(closedWorld, codegenWorldBuilder); 1249 _namer = determineNamer(closedWorld, codegenWorldBuilder);
1238 tracer = new Tracer(closedWorld, namer, compiler); 1250 tracer = new Tracer(closedWorld, namer, compiler);
1239 emitter.createEmitter(_namer, closedWorld); 1251 emitter.createEmitter(namer, closedWorld);
1240 _rtiEncoder = 1252 _rtiEncoder =
1241 _namer.rtiEncoder = new _RuntimeTypesEncoder(_namer, emitter, helpers); 1253 _namer.rtiEncoder = new _RuntimeTypesEncoder(namer, emitter, helpers);
1242 1254 _codegenImpactTransformer = new CodegenImpactTransformer(
1255 this,
1256 compiler.options,
1257 compiler.elementEnvironment,
1258 helpers,
1259 impacts,
1260 checkedModeHelpers,
1261 nativeData,
1262 rtiNeed,
1263 nativeCodegenEnqueuer,
1264 namer,
1265 mirrorsData,
1266 oneShotInterceptorData,
1267 lookupMapAnalysis,
1268 customElementsCodegenAnalysis);
1243 lookupMapAnalysis.onCodegenStart(lookupMapLibraryAccess); 1269 lookupMapAnalysis.onCodegenStart(lookupMapLibraryAccess);
1244 return const WorldImpact(); 1270 return const WorldImpact();
1245 } 1271 }
1246 1272
1247 /// Called when code generation has been completed. 1273 /// Called when code generation has been completed.
1248 void onCodegenEnd() { 1274 void onCodegenEnd() {
1249 sourceInformationStrategy.onComplete(); 1275 sourceInformationStrategy.onComplete();
1250 tracer.close(); 1276 tracer.close();
1251 } 1277 }
1252 1278
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 return _backend.defaultSuperclass(element); 1656 return _backend.defaultSuperclass(element);
1631 } 1657 }
1632 1658
1633 @override 1659 @override
1634 bool isNativeClass(ClassEntity element) => 1660 bool isNativeClass(ClassEntity element) =>
1635 _backend.nativeClassData.isNativeClass(element); 1661 _backend.nativeClassData.isNativeClass(element);
1636 1662
1637 @override 1663 @override
1638 bool isForeign(Element element) => _backend.isForeign(element); 1664 bool isForeign(Element element) => _backend.isForeign(element);
1639 } 1665 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/common/backend_api.dart ('k') | pkg/compiler/lib/src/js_backend/impact_transformer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698