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

Side by Side Diff: pkg/compiler/lib/src/ssa/codegen.dart

Issue 2897273002: Add FunctionEntity.asyncMarker and refactor SourceInformationStrategy to avoid ResolvedAst (Closed)
Patch Set: Created 3 years, 7 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 import 'dart:math' as math; 5 import 'dart:math' as math;
6 import 'dart:collection' show Queue; 6 import 'dart:collection' show Queue;
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; 8 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
9 import '../common/tasks.dart' show CompilerTask; 9 import '../common/tasks.dart' show CompilerTask;
10 import '../constants/constant_system.dart'; 10 import '../constants/constant_system.dart';
11 import '../constants/values.dart'; 11 import '../constants/values.dart';
12 import '../common_elements.dart' show CommonElements; 12 import '../common_elements.dart' show CommonElements;
13 import '../elements/elements.dart' 13 import '../elements/elements.dart'
14 show AsyncMarker, JumpTarget, LabelDefinition, MethodElement, ResolvedAst; 14 show JumpTarget, LabelDefinition, MethodElement;
15 import '../elements/entities.dart'; 15 import '../elements/entities.dart';
16 import '../elements/types.dart'; 16 import '../elements/types.dart';
17 import '../io/source_information.dart'; 17 import '../io/source_information.dart';
18 import '../js/js.dart' as js; 18 import '../js/js.dart' as js;
19 import '../js_backend/interceptor_data.dart'; 19 import '../js_backend/interceptor_data.dart';
20 import '../js_backend/backend.dart'; 20 import '../js_backend/backend.dart';
21 import '../js_backend/checked_mode_helpers.dart'; 21 import '../js_backend/checked_mode_helpers.dart';
22 import '../js_backend/element_strategy.dart' show ElementCodegenWorkItem;
23 import '../js_backend/native_data.dart'; 22 import '../js_backend/native_data.dart';
24 import '../js_backend/namer.dart'; 23 import '../js_backend/namer.dart';
25 import '../js_backend/runtime_types.dart'; 24 import '../js_backend/runtime_types.dart';
26 import '../js_emitter/code_emitter_task.dart'; 25 import '../js_emitter/code_emitter_task.dart';
27 import '../native/native.dart' as native; 26 import '../native/native.dart' as native;
28 import '../options.dart'; 27 import '../options.dart';
29 import '../types/types.dart'; 28 import '../types/types.dart';
30 import '../universe/call_structure.dart' show CallStructure; 29 import '../universe/call_structure.dart' show CallStructure;
31 import '../universe/selector.dart' show Selector; 30 import '../universe/selector.dart' show Selector;
32 import '../universe/use.dart' show ConstantUse, DynamicUse, StaticUse, TypeUse; 31 import '../universe/use.dart' show ConstantUse, DynamicUse, StaticUse, TypeUse;
33 import '../util/util.dart'; 32 import '../util/util.dart';
34 import '../world.dart' show ClosedWorld; 33 import '../world.dart' show ClosedWorld;
35 import 'codegen_helpers.dart'; 34 import 'codegen_helpers.dart';
36 import 'nodes.dart'; 35 import 'nodes.dart';
37 import 'variable_allocator.dart'; 36 import 'variable_allocator.dart';
38 37
39 class SsaCodeGeneratorTask extends CompilerTask { 38 class SsaCodeGeneratorTask extends CompilerTask {
40 final JavaScriptBackend backend; 39 final JavaScriptBackend backend;
41 final SourceInformationStrategy sourceInformationFactory; 40 final SourceInformationStrategy sourceInformationFactory;
42 41
43 SsaCodeGeneratorTask(JavaScriptBackend backend, this.sourceInformationFactory) 42 SsaCodeGeneratorTask(JavaScriptBackend backend, this.sourceInformationFactory)
44 : this.backend = backend, 43 : this.backend = backend,
45 super(backend.compiler.measurer); 44 super(backend.compiler.measurer);
46 45
47 String get name => 'SSA code generator'; 46 String get name => 'SSA code generator';
48 47
49 js.Fun buildJavaScriptFunction( 48 js.Fun buildJavaScriptFunction(
50 ResolvedAst resolvedAst, List<js.Parameter> parameters, js.Block body) { 49 FunctionEntity element, List<js.Parameter> parameters, js.Block body) {
51 MethodElement element = resolvedAst.element;
52 js.AsyncModifier asyncModifier = element.asyncMarker.isAsync 50 js.AsyncModifier asyncModifier = element.asyncMarker.isAsync
53 ? (element.asyncMarker.isYielding 51 ? (element.asyncMarker.isYielding
54 ? const js.AsyncModifier.asyncStar() 52 ? const js.AsyncModifier.asyncStar()
55 : const js.AsyncModifier.async()) 53 : const js.AsyncModifier.async())
56 : (element.asyncMarker.isYielding 54 : (element.asyncMarker.isYielding
57 ? const js.AsyncModifier.syncStar() 55 ? const js.AsyncModifier.syncStar()
58 : const js.AsyncModifier.sync()); 56 : const js.AsyncModifier.sync());
59 57
60 return new js.Fun(parameters, body, asyncModifier: asyncModifier) 58 return new js.Fun(parameters, body, asyncModifier: asyncModifier)
61 .withSourceInformation(sourceInformationFactory 59 .withSourceInformation(sourceInformationFactory
62 .createBuilderForContext(resolvedAst) 60 .createBuilderForContext(element)
63 .buildDeclaration(resolvedAst)); 61 .buildDeclaration(element));
64 } 62 }
65 63
66 js.Expression generateCode( 64 js.Expression generateCode(
67 ElementCodegenWorkItem work, HGraph graph, ClosedWorld closedWorld) { 65 CodegenWorkItem work, HGraph graph, ClosedWorld closedWorld) {
68 if (work.element.isField) { 66 if (work.element.isField) {
69 return generateLazyInitializer(work, graph, closedWorld); 67 return generateLazyInitializer(work, graph, closedWorld);
70 } else { 68 } else {
71 return generateMethod(work, graph, closedWorld); 69 return generateMethod(work, graph, closedWorld);
72 } 70 }
73 } 71 }
74 72
75 js.Expression generateLazyInitializer( 73 js.Expression generateLazyInitializer(
76 ElementCodegenWorkItem work, HGraph graph, ClosedWorld closedWorld) { 74 CodegenWorkItem work, HGraph graph, ClosedWorld closedWorld) {
77 return measure(() { 75 return measure(() {
78 backend.tracer.traceGraph("codegen", graph); 76 backend.tracer.traceGraph("codegen", graph);
79 SourceInformation sourceInformation = sourceInformationFactory 77 SourceInformation sourceInformation = sourceInformationFactory
80 .createBuilderForContext(work.resolvedAst) 78 .createBuilderForContext(work.element)
81 .buildDeclaration(work.resolvedAst); 79 .buildDeclaration(work.element);
82 SsaCodeGenerator codegen = new SsaCodeGenerator( 80 SsaCodeGenerator codegen = new SsaCodeGenerator(
83 backend.compiler.options, 81 backend.compiler.options,
84 backend.emitter, 82 backend.emitter,
85 backend.nativeCodegenEnqueuer, 83 backend.nativeCodegenEnqueuer,
86 backend.checkedModeHelpers, 84 backend.checkedModeHelpers,
87 backend.oneShotInterceptorData, 85 backend.oneShotInterceptorData,
88 backend.rtiSubstitutions, 86 backend.rtiSubstitutions,
89 backend.rtiEncoder, 87 backend.rtiEncoder,
90 backend.namer, 88 backend.namer,
91 backend.superMemberData, 89 backend.superMemberData,
92 closedWorld, 90 closedWorld,
93 work); 91 work);
94 codegen.visitGraph(graph); 92 codegen.visitGraph(graph);
95 return new js.Fun(codegen.parameters, codegen.body) 93 return new js.Fun(codegen.parameters, codegen.body)
96 .withSourceInformation(sourceInformation); 94 .withSourceInformation(sourceInformation);
97 }); 95 });
98 } 96 }
99 97
100 js.Expression generateMethod( 98 js.Expression generateMethod(
101 ElementCodegenWorkItem work, HGraph graph, ClosedWorld closedWorld) { 99 CodegenWorkItem work, HGraph graph, ClosedWorld closedWorld) {
102 return measure(() { 100 return measure(() {
103 MethodElement element = work.element; 101 FunctionEntity element = work.element;
104 if (element.asyncMarker != AsyncMarker.SYNC) { 102 if (element.asyncMarker != AsyncMarker.SYNC) {
105 work.registry.registerAsyncMarker(element.asyncMarker); 103 work.registry.registerAsyncMarker(element.asyncMarker);
106 } 104 }
107 SsaCodeGenerator codegen = new SsaCodeGenerator( 105 SsaCodeGenerator codegen = new SsaCodeGenerator(
108 backend.compiler.options, 106 backend.compiler.options,
109 backend.emitter, 107 backend.emitter,
110 backend.nativeCodegenEnqueuer, 108 backend.nativeCodegenEnqueuer,
111 backend.checkedModeHelpers, 109 backend.checkedModeHelpers,
112 backend.oneShotInterceptorData, 110 backend.oneShotInterceptorData,
113 backend.rtiSubstitutions, 111 backend.rtiSubstitutions,
114 backend.rtiEncoder, 112 backend.rtiEncoder,
115 backend.namer, 113 backend.namer,
116 backend.superMemberData, 114 backend.superMemberData,
117 closedWorld, 115 closedWorld,
118 work); 116 work);
119 codegen.visitGraph(graph); 117 codegen.visitGraph(graph);
120 backend.tracer.traceGraph("codegen", graph); 118 backend.tracer.traceGraph("codegen", graph);
121 return buildJavaScriptFunction( 119 return buildJavaScriptFunction(
122 work.resolvedAst, codegen.parameters, codegen.body); 120 work.element, codegen.parameters, codegen.body);
123 }); 121 });
124 } 122 }
125 } 123 }
126 124
127 typedef void EntityAction(Entity element); 125 typedef void EntityAction(Entity element);
128 126
129 class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { 127 class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
130 /** 128 /**
131 * Returned by [expressionType] to tell how code can be generated for 129 * Returned by [expressionType] to tell how code can be generated for
132 * a subgraph. 130 * a subgraph.
(...skipping 2910 matching lines...) Expand 10 before | Expand all | Expand 10 after
3043 return _closedWorld.anyStrictSubclassOf(cls, (ClassEntity subclass) { 3041 return _closedWorld.anyStrictSubclassOf(cls, (ClassEntity subclass) {
3044 return !_rtiSubstitutions.isTrivialSubstitution(subclass, cls); 3042 return !_rtiSubstitutions.isTrivialSubstitution(subclass, cls);
3045 }); 3043 });
3046 } 3044 }
3047 3045
3048 @override 3046 @override
3049 void visitRef(HRef node) { 3047 void visitRef(HRef node) {
3050 visit(node.value); 3048 visit(node.value);
3051 } 3049 }
3052 } 3050 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | pkg/compiler/lib/src/ssa/rasta_ssa_builder_task.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698