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

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

Issue 2290893002: kernel -> ssa: support static invocations and variable gets (Closed)
Patch Set: rename typemask function Created 4 years, 3 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
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; 7 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
8 import '../common/tasks.dart' show CompilerTask; 8 import '../common/tasks.dart' show CompilerTask;
9 import '../compiler.dart'; 9 import '../compiler.dart';
10 import '../diagnostics/spannable.dart'; 10 import '../diagnostics/spannable.dart';
11 import '../elements/elements.dart'; 11 import '../elements/elements.dart';
12 import '../io/source_information.dart'; 12 import '../io/source_information.dart';
13 import '../js_backend/backend.dart' show JavaScriptBackend; 13 import '../js_backend/backend.dart' show JavaScriptBackend;
14 import '../kernel/kernel.dart'; 14 import '../kernel/kernel.dart';
15 import '../kernel/kernel_visitor.dart'; 15 import '../kernel/kernel_visitor.dart';
16 import '../resolution/tree_elements.dart'; 16 import '../resolution/tree_elements.dart';
17 import '../tree/dartstring.dart'; 17 import '../tree/dartstring.dart';
18 import '../types/masks.dart';
18 19
19 import 'graph_builder.dart'; 20 import 'graph_builder.dart';
20 import 'kernel_ast_adapter.dart'; 21 import 'kernel_ast_adapter.dart';
21 import 'locals_handler.dart'; 22 import 'locals_handler.dart';
22 import 'nodes.dart'; 23 import 'nodes.dart';
23 24
24 class SsaKernelBuilderTask extends CompilerTask { 25 class SsaKernelBuilderTask extends CompilerTask {
25 final JavaScriptBackend backend; 26 final JavaScriptBackend backend;
26 final SourceInformationStrategy sourceInformationFactory; 27 final SourceInformationStrategy sourceInformationFactory;
27 28
(...skipping 15 matching lines...) Expand all
43 } catch (e) { 44 } catch (e) {
44 throw "Failed to convert to Kernel IR: $e"; 45 throw "Failed to convert to Kernel IR: $e";
45 } 46 }
46 KernelSsaBuilder builder = new KernelSsaBuilder( 47 KernelSsaBuilder builder = new KernelSsaBuilder(
47 function, 48 function,
48 element, 49 element,
49 work.resolvedAst, 50 work.resolvedAst,
50 backend.compiler, 51 backend.compiler,
51 work.registry, 52 work.registry,
52 sourceInformationFactory, 53 sourceInformationFactory,
53 visitor); 54 visitor,
55 kernel);
54 return builder.build(); 56 return builder.build();
55 }); 57 });
56 } 58 }
57 } 59 }
58 60
59 class KernelSsaBuilder extends ir.Visitor with GraphBuilder { 61 class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
60 final IrFunction function; 62 final IrFunction function;
61 final FunctionElement functionElement; 63 final FunctionElement functionElement;
62 final ResolvedAst resolvedAst; 64 final ResolvedAst resolvedAst;
63 final Compiler compiler; 65 final Compiler compiler;
64 final CodegenRegistry registry; 66 final CodegenRegistry registry;
65 67
66 JavaScriptBackend get backend => compiler.backend; 68 JavaScriptBackend get backend => compiler.backend;
67 69
68 LocalsHandler localsHandler; 70 LocalsHandler localsHandler;
69 SourceInformationBuilder sourceInformationBuilder; 71 SourceInformationBuilder sourceInformationBuilder;
70 KernelAstAdapter astAdapter; 72 KernelAstAdapter astAdapter;
71 73
72 KernelSsaBuilder( 74 KernelSsaBuilder(
73 this.function, 75 this.function,
74 this.functionElement, 76 this.functionElement,
75 this.resolvedAst, 77 this.resolvedAst,
76 this.compiler, 78 this.compiler,
77 this.registry, 79 this.registry,
78 SourceInformationStrategy sourceInformationFactory, 80 SourceInformationStrategy sourceInformationFactory,
79 KernelVisitor visitor) { 81 KernelVisitor visitor,
82 Kernel kernel) {
80 graph.element = functionElement; 83 graph.element = functionElement;
81 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? 84 // TODO(het): Should sourceInformationBuilder be in GraphBuilder?
82 this.sourceInformationBuilder = 85 this.sourceInformationBuilder =
83 sourceInformationFactory.createBuilderForContext(resolvedAst); 86 sourceInformationFactory.createBuilderForContext(resolvedAst);
84 graph.sourceInformation = 87 graph.sourceInformation =
85 sourceInformationBuilder.buildVariableDeclaration(); 88 sourceInformationBuilder.buildVariableDeclaration();
86 this.localsHandler = 89 this.localsHandler =
87 new LocalsHandler(this, functionElement, null, compiler); 90 new LocalsHandler(this, functionElement, null, compiler);
88 this.astAdapter = 91 this.astAdapter = new KernelAstAdapter(compiler.backend, resolvedAst,
89 new KernelAstAdapter(compiler.backend, resolvedAst, visitor.nodeToAst); 92 visitor.nodeToAst, visitor.nodeToElement, kernel.functions);
90 } 93 }
91 94
92 HGraph build() { 95 HGraph build() {
93 // TODO(het): no reason to do this here... 96 // TODO(het): no reason to do this here...
94 HInstruction.idCounter = 0; 97 HInstruction.idCounter = 0;
95 if (function.kind == ir.ProcedureKind.Method) { 98 if (function.kind == ir.ProcedureKind.Method) {
96 buildMethod(function, functionElement); 99 buildMethod(function, functionElement);
97 } else { 100 } else {
98 compiler.reporter.internalError( 101 compiler.reporter.internalError(
99 functionElement, 102 functionElement,
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 } 182 }
180 183
181 @override 184 @override
182 visitStringLiteral(ir.StringLiteral stringLiteral) { 185 visitStringLiteral(ir.StringLiteral stringLiteral) {
183 stack.add(graph.addConstantString( 186 stack.add(graph.addConstantString(
184 new DartString.literal(stringLiteral.value), compiler)); 187 new DartString.literal(stringLiteral.value), compiler));
185 } 188 }
186 189
187 @override 190 @override
188 visitSymbolLiteral(ir.SymbolLiteral symbolLiteral) { 191 visitSymbolLiteral(ir.SymbolLiteral symbolLiteral) {
189 stack.add( 192 stack.add(graph.addConstant(
190 graph.addConstant(astAdapter.getConstantFor(symbolLiteral), compiler)); 193 astAdapter.getConstantForSymbol(symbolLiteral), compiler));
191 registry?.registerConstSymbol(symbolLiteral.value); 194 registry?.registerConstSymbol(symbolLiteral.value);
192 } 195 }
193 196
194 @override 197 @override
195 visitNullLiteral(ir.NullLiteral nullLiteral) { 198 visitNullLiteral(ir.NullLiteral nullLiteral) {
196 stack.add(graph.addConstantNull(compiler)); 199 stack.add(graph.addConstantNull(compiler));
197 } 200 }
201
202 @override
203 visitVariableGet(ir.VariableGet variableGet) {
204 LocalElement local = astAdapter.getElement(variableGet.variable);
205 stack.add(localsHandler.readLocal(local));
206 }
207
208 @override
209 visitStaticInvocation(ir.StaticInvocation invocation) {
210 List<HInstruction> inputs = <HInstruction>[];
211
212 for (ir.Expression argument in invocation.arguments.positional) {
213 argument.accept(this);
214 inputs.add(pop());
215 }
216 for (ir.NamedExpression argument in invocation.arguments.named) {
217 argument.value.accept(this);
218 inputs.add(pop());
219 }
220
221 ir.Procedure target = invocation.target;
222 bool targetCanThrow = astAdapter.getCanThrow(target);
223 TypeMask typeMask = astAdapter.returnTypeOf(target);
224
225 HInstruction instruction = new HInvokeStatic(
226 astAdapter.getElement(target).declaration, inputs, typeMask,
227 targetCanThrow: targetCanThrow);
228 instruction.sideEffects = astAdapter.getSideEffects(target);
229
230 push(instruction);
231 }
232
233 @override
234 visitExpressionStatement(ir.ExpressionStatement exprStatement) {
235 exprStatement.expression.accept(this);
236 pop();
237 }
198 } 238 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698