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

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

Issue 2984643002: Add Class/MemberDefinition to handle synthesized classes/members (Closed)
Patch Set: Created 3 years, 5 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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../closure.dart'; 7 import '../closure.dart';
8 import '../common.dart'; 8 import '../common.dart';
9 import '../common/codegen.dart' show CodegenRegistry; 9 import '../common/codegen.dart' show CodegenRegistry;
10 import '../common/names.dart'; 10 import '../common/names.dart';
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 import 'locals_handler.dart'; 42 import 'locals_handler.dart';
43 import 'loop_handler.dart'; 43 import 'loop_handler.dart';
44 import 'nodes.dart'; 44 import 'nodes.dart';
45 import 'ssa.dart'; 45 import 'ssa.dart';
46 import 'ssa_branch_builder.dart'; 46 import 'ssa_branch_builder.dart';
47 import 'switch_continue_analysis.dart'; 47 import 'switch_continue_analysis.dart';
48 import 'type_builder.dart'; 48 import 'type_builder.dart';
49 49
50 class KernelSsaGraphBuilder extends ir.Visitor 50 class KernelSsaGraphBuilder extends ir.Visitor
51 with GraphBuilder, SsaBuilderFieldMixin { 51 with GraphBuilder, SsaBuilderFieldMixin {
52 final ir.Node target;
53 final MemberEntity targetElement; 52 final MemberEntity targetElement;
54 53
55 /// The root node of [targetElement]. This is used as the key into the 54 /// The root node of [targetElement]. This is used as the key into the
56 /// [startFunction] of the locals handler. 55 /// [startFunction] of the locals handler.
57 // TODO(johnniwinther,efortuna): Avoid the need for AST nodes in the locals 56 // TODO(johnniwinther,efortuna): Avoid the need for AST nodes in the locals
58 // handler. 57 // handler.
59 final Node functionNode; 58 final Node functionNode;
60 final ClosedWorld closedWorld; 59 final ClosedWorld closedWorld;
61 final CodegenWorldBuilder _worldBuilder; 60 final CodegenWorldBuilder _worldBuilder;
62 final CodegenRegistry registry; 61 final CodegenRegistry registry;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 final Map<ir.VariableDeclaration, HInstruction> letBindings = 96 final Map<ir.VariableDeclaration, HInstruction> letBindings =
98 <ir.VariableDeclaration, HInstruction>{}; 97 <ir.VariableDeclaration, HInstruction>{};
99 98
100 /// True if we are visiting the expression of a throw statement; we assume 99 /// True if we are visiting the expression of a throw statement; we assume
101 /// this is a slow path. 100 /// this is a slow path.
102 bool _inExpressionOfThrow = false; 101 bool _inExpressionOfThrow = false;
103 102
104 KernelSsaGraphBuilder( 103 KernelSsaGraphBuilder(
105 this.targetElement, 104 this.targetElement,
106 ClassEntity contextClass, 105 ClassEntity contextClass,
107 this.target,
108 this.compiler, 106 this.compiler,
109 this._elementMap, 107 this._elementMap,
110 this._typeInferenceMap, 108 this._typeInferenceMap,
111 this.localsMap, 109 this.localsMap,
112 this.closedWorld, 110 this.closedWorld,
113 this._worldBuilder, 111 this._worldBuilder,
114 this.registry, 112 this.registry,
115 this.closureDataLookup, 113 this.closureDataLookup,
116 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? 114 // TODO(het): Should sourceInformationBuilder be in GraphBuilder?
117 this.sourceInformationBuilder, 115 this.sourceInformationBuilder,
118 this.functionNode) { 116 this.functionNode) {
119 this.loopHandler = new KernelLoopHandler(this); 117 this.loopHandler = new KernelLoopHandler(this);
120 typeBuilder = new TypeBuilder(this); 118 typeBuilder = new TypeBuilder(this);
121 graph.element = targetElement; 119 graph.element = targetElement;
122 graph.sourceInformation = 120 graph.sourceInformation =
123 sourceInformationBuilder.buildVariableDeclaration(); 121 sourceInformationBuilder.buildVariableDeclaration();
124 this.localsHandler = new LocalsHandler(this, targetElement, targetElement, 122 this.localsHandler = new LocalsHandler(this, targetElement, targetElement,
125 contextClass, null, nativeData, interceptorData); 123 contextClass, null, nativeData, interceptorData);
126 _targetStack.add(targetElement); 124 _targetStack.add(targetElement);
127 } 125 }
128 126
129 CommonElements get _commonElements => _elementMap.commonElements; 127 CommonElements get _commonElements => _elementMap.commonElements;
130 128
131 HGraph build() { 129 HGraph build() {
132 return reporter.withCurrentElement(localsMap.currentMember, () { 130 return reporter.withCurrentElement(localsMap.currentMember, () {
133 // TODO(het): no reason to do this here... 131 // TODO(het): no reason to do this here...
134 HInstruction.idCounter = 0; 132 HInstruction.idCounter = 0;
135 if (target is ir.Procedure) { 133 MemberDefinition definition =
136 _targetFunction = (target as ir.Procedure).function; 134 _elementMap.getMemberDefinition(targetElement);
137 buildFunctionNode(_targetFunction); 135
138 } else if (target is ir.Field) { 136 switch (definition.kind) {
139 if (handleConstantField(targetElement, registry, closedWorld)) { 137 case MemberKind.regular:
140 // No code is generated for `targetElement`: All references inline the 138 case MemberKind.closureCall:
141 // constant value. 139 ir.Node target = definition.node;
142 return null; 140 if (target is ir.Procedure) {
143 } else if (targetElement.isStatic || targetElement.isTopLevel) { 141 _targetFunction = target.function;
144 backend.constants.registerLazyStatic(targetElement); 142 buildFunctionNode(_targetFunction);
145 } 143 } else if (target is ir.Field) {
146 buildField(target); 144 if (handleConstantField(targetElement, registry, closedWorld)) {
147 } else if (target is ir.Constructor) { 145 // No code is generated for `targetElement`: All references inline the
148 if (targetElement is ConstructorBodyEntity) { 146 // constant value.
149 buildConstructorBody(target); 147 return null;
150 } else { 148 } else if (targetElement.isStatic || targetElement.isTopLevel) {
151 buildConstructor(target); 149 backend.constants.registerLazyStatic(targetElement);
152 } 150 }
153 } else if (target is ir.FunctionExpression) { 151 buildField(target);
154 _targetFunction = (target as ir.FunctionExpression).function; 152 } else if (target is ir.FunctionExpression) {
155 buildFunctionNode(_targetFunction); 153 _targetFunction = target.function;
156 } else if (target is ir.FunctionDeclaration) { 154 buildFunctionNode(_targetFunction);
157 _targetFunction = (target as ir.FunctionDeclaration).function; 155 } else if (target is ir.FunctionDeclaration) {
158 buildFunctionNode(_targetFunction); 156 _targetFunction = target.function;
159 } else { 157 buildFunctionNode(_targetFunction);
160 throw 'No case implemented to handle target: ' 158 } else {
161 '$target for $targetElement'; 159 throw 'No case implemented to handle target: '
160 '$target for $targetElement';
161 }
162 break;
163 case MemberKind.constructor:
164 buildConstructor(definition.node);
165 break;
166 case MemberKind.constructorBody:
167 buildConstructorBody(definition.node);
168 break;
162 } 169 }
163 assert(graph.isValid()); 170 assert(graph.isValid());
164 return graph; 171 return graph;
165 }); 172 });
166 } 173 }
167 174
168 @override 175 @override
169 ConstantValue getFieldInitialConstantValue(FieldEntity field) { 176 ConstantValue getFieldInitialConstantValue(FieldEntity field) {
170 assert(field == targetElement); 177 assert(field == targetElement);
171 return _elementMap.getFieldConstantValue(target); 178 MemberDefinition definition = _elementMap.getMemberDefinition(field);
179 assert(definition.kind == MemberKind.regular,
180 failedAt(field, "Unexpected member definition: $definition"));
181 return _elementMap.getFieldConstantValue(definition.node);
172 } 182 }
173 183
174 void buildField(ir.Field field) { 184 void buildField(ir.Field field) {
175 openFunction(); 185 openFunction();
176 if (field.initializer != null) { 186 if (field.initializer != null) {
177 field.initializer.accept(this); 187 field.initializer.accept(this);
178 HInstruction fieldValue = pop(); 188 HInstruction fieldValue = pop();
179 HInstruction checkInstruction = typeBuilder.potentiallyCheckOrTrustType( 189 HInstruction checkInstruction = typeBuilder.potentiallyCheckOrTrustType(
180 fieldValue, _getDartTypeIfValid(field.type)); 190 fieldValue, _getDartTypeIfValid(field.type));
181 stack.add(checkInstruction); 191 stack.add(checkInstruction);
(...skipping 3334 matching lines...) Expand 10 before | Expand all | Expand 10 after
3516 enterBlock.setBlockFlow( 3526 enterBlock.setBlockFlow(
3517 new HTryBlockInformation( 3527 new HTryBlockInformation(
3518 kernelBuilder.wrapStatementGraph(bodyGraph), 3528 kernelBuilder.wrapStatementGraph(bodyGraph),
3519 exception, 3529 exception,
3520 kernelBuilder.wrapStatementGraph(catchGraph), 3530 kernelBuilder.wrapStatementGraph(catchGraph),
3521 kernelBuilder.wrapStatementGraph(finallyGraph)), 3531 kernelBuilder.wrapStatementGraph(finallyGraph)),
3522 exitBlock); 3532 exitBlock);
3523 kernelBuilder.inTryStatement = previouslyInTryStatement; 3533 kernelBuilder.inTryStatement = previouslyInTryStatement;
3524 } 3534 }
3525 } 3535 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698