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

Unified Diff: pkg/compiler/lib/src/ssa/builder_kernel.dart

Issue 2297853003: implement kernel -> ssa for simple binary expression (Closed)
Patch Set: add TODO, rename adapter method Created 4 years, 4 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/builder_kernel.dart
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 9c91c0fcdb76605306429ce4e86130b2722e57f0..02a207e7726eff694247df740994f132eadf4c0e 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -95,7 +95,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
HGraph build() {
// TODO(het): no reason to do this here...
HInstruction.idCounter = 0;
- if (function.kind == ir.ProcedureKind.Method) {
+ if (function.kind == ir.ProcedureKind.Method ||
+ function.kind == ir.ProcedureKind.Operator) {
buildMethod(function, functionElement);
} else {
compiler.reporter.internalError(
@@ -117,7 +118,6 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void openFunction(IrFunction method, FunctionElement functionElement) {
HBasicBlock block = graph.addNewBlock();
open(graph.entry);
- // TODO(het): Register parameters with a locals handler
localsHandler.startFunction(functionElement, resolvedAst.node);
close(new HGoto()).addSuccessor(block);
@@ -205,31 +205,70 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
stack.add(localsHandler.readLocal(local));
}
- @override
- visitStaticInvocation(ir.StaticInvocation invocation) {
- List<HInstruction> inputs = <HInstruction>[];
+ // TODO(het): Also extract type arguments
+ /// Extracts the list of instructions for the expressions in the arguments.
+ List<HInstruction> _visitArguments(ir.Arguments arguments) {
+ List<HInstruction> result = <HInstruction>[];
- for (ir.Expression argument in invocation.arguments.positional) {
+ for (ir.Expression argument in arguments.positional) {
argument.accept(this);
- inputs.add(pop());
+ result.add(pop());
}
- for (ir.NamedExpression argument in invocation.arguments.named) {
+ for (ir.NamedExpression argument in arguments.named) {
argument.value.accept(this);
- inputs.add(pop());
+ result.add(pop());
}
+ return result;
+ }
+
+ @override
+ visitStaticInvocation(ir.StaticInvocation invocation) {
ir.Procedure target = invocation.target;
bool targetCanThrow = astAdapter.getCanThrow(target);
TypeMask typeMask = astAdapter.returnTypeOf(target);
+ var arguments = _visitArguments(invocation.arguments);
+
HInstruction instruction = new HInvokeStatic(
- astAdapter.getElement(target).declaration, inputs, typeMask,
+ astAdapter.getElement(target).declaration, arguments, typeMask,
targetCanThrow: targetCanThrow);
instruction.sideEffects = astAdapter.getSideEffects(target);
push(instruction);
}
+ // TODO(het): Decide when to inline
+ @override
+ visitMethodInvocation(ir.MethodInvocation invocation) {
+ invocation.receiver.accept(this);
+ HInstruction receiver = pop();
+
+ List<HInstruction> arguments = <HInstruction>[receiver]
+ ..addAll(_visitArguments(invocation.arguments));
+
+ List<HInstruction> inputs = <HInstruction>[];
+
+ bool isIntercepted = astAdapter.isIntercepted(invocation);
+ if (isIntercepted) {
+ HInterceptor interceptor =
+ new HInterceptor(receiver, backend.nonNullType);
+ add(interceptor);
+ inputs.add(interceptor);
+ }
+ inputs.addAll(arguments);
+
+ TypeMask type = astAdapter.selectorTypeOf(invocation);
+
+ push(new HInvokeDynamicMethod(astAdapter.getSelector(invocation),
+ astAdapter.getTypeMask(invocation), inputs, type, isIntercepted));
+ }
+
+ @override
+ visitThisExpression(ir.ThisExpression thisExpression) {
+ stack.add(localsHandler.readThis());
+ }
+
@override
visitExpressionStatement(ir.ExpressionStatement exprStatement) {
exprStatement.expression.accept(this);
« 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