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

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart

Issue 979693003: Streamline the CPS IR Visitor interface. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Signal an error in visit methods that should not be called. Created 5 years, 10 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
Index: pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
index 1fcb5a732889f1a964485fdda261b1df811d129f..448210697508567eaf96f77b1d8a58222fafbb2d 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
@@ -31,34 +31,51 @@ class IRTracer extends TracerUtil implements cps_ir.Visitor {
// Temporary field used during tree walk
Names names;
- visitExecutableDefinition(cps_ir.ExecutableDefinition node) {
+ printDefinition(cps_ir.ExecutableDefinition node) {
names = new Names();
BlockCollector builder = new BlockCollector(names);
builder.visit(node);
for (Block block in builder.entries) {
- printNode(block);
+ printBlock(block);
}
for (Block block in builder.cont2block.values) {
- printNode(block);
+ printBlock(block);
}
names = null;
}
visitFieldDefinition(cps_ir.FieldDefinition node) {
if (node.hasInitializer) {
- visitExecutableDefinition(node);
+ printDefinition(node);
}
}
visitFunctionDefinition(cps_ir.FunctionDefinition node) {
if (node.isAbstract) return;
- visitExecutableDefinition(node);
+ printDefinition(node);
}
visitConstructorDefinition(cps_ir.ConstructorDefinition node) {
if (node.isAbstract) return;
- visitExecutableDefinition(node);
+ printDefinition(node);
+ }
+
+ // Bodies and initializers are not visited. They contain continuations which
+ // are found by a BlockCollector, then those continuations are processed by
+ // this visitor.
+ unexpectedNode(cps_ir.Node node) {
+ throw 'The IR tracer reached an unexpected IR instruction: $node';
+ }
+
+ visitRunnableBody(cps_ir.RunnableBody node) {
+ unexpectedNode(node);
+ }
+ visitFieldInitializer(cps_ir.FieldInitializer node) {
+ unexpectedNode(node);
+ }
+ visitSuperInitializer(cps_ir.SuperInitializer node) {
+ unexpectedNode(node);
}
int countUses(cps_ir.Definition definition) {
@@ -71,7 +88,7 @@ class IRTracer extends TracerUtil implements cps_ir.Visitor {
return count;
}
- printNode(Block block) {
+ printBlock(Block block) {
tag("block", () {
printProperty("name", block.name);
printProperty("from_bci", -1);
@@ -320,16 +337,6 @@ class IRTracer extends TracerUtil implements cps_ir.Visitor {
String variable = names.name(node.variable.definition);
return '${node.runtimeType} $variable';
}
-
- visitRunnableBody(cps_ir.RunnableBody node) {}
- visitFieldInitializer(cps_ir.FieldInitializer node) {}
- visitSuperInitializer(cps_ir.SuperInitializer node) {}
- visitCondition(cps_ir.Condition c) {}
- visitExpression(cps_ir.Expression e) {}
- visitPrimitive(cps_ir.Primitive p) {}
- visitDefinition(cps_ir.Definition d) {}
- visitInitializer(cps_ir.Initializer i) {}
- visitNode(cps_ir.Node n) {}
}
/**
@@ -385,7 +392,7 @@ class Block {
}
}
-class BlockCollector extends cps_ir.Visitor {
+class BlockCollector implements cps_ir.Visitor {
final Map<cps_ir.Continuation, Block> cont2block =
<cps_ir.Continuation, Block>{};
final Set<Block> entries = new Set<Block>();
@@ -403,36 +410,34 @@ class BlockCollector extends cps_ir.Visitor {
return block;
}
- visitRunnableBody(cps_ir.RunnableBody node) {
- current_block = new Block(names.name(node), [], node.body);
- entries.add(current_block);
- visit(node.body);
- }
+ visit(cps_ir.Node node) => node.accept(this);
- visitFieldInitializer(cps_ir.FieldInitializer node) {
- visit(node.body);
+ visitFieldDefinition(cps_ir.FieldDefinition node) {
+ if (node.hasInitializer) {
+ visit(node.body);
+ }
}
- visitSuperInitializer(cps_ir.SuperInitializer node) {
- node.arguments.forEach(visit);
+ visitFunctionDefinition(cps_ir.FunctionDefinition node) {
+ visit(node.body);
}
- visitExecutableDefinition(cps_ir.ExecutableDefinition node) {
+ visitConstructorDefinition(cps_ir.ConstructorDefinition node) {
visit(node.body);
}
- visitFieldDefinition(cps_ir.FieldDefinition node) {
- if (node.hasInitializer) {
- visitExecutableDefinition(node);
- }
+ visitRunnableBody(cps_ir.RunnableBody node) {
+ current_block = new Block(names.name(node), [], node.body);
+ entries.add(current_block);
+ visit(node.body);
}
- visitFunctionDefinition(cps_ir.FunctionDefinition node) {
- visitExecutableDefinition(node);
+ visitFieldInitializer(cps_ir.FieldInitializer node) {
+ visit(node.body);
}
- visitConstructorDefinition(cps_ir.ConstructorDefinition node) {
- visitExecutableDefinition(node);
+ visitSuperInitializer(cps_ir.SuperInitializer node) {
+ node.arguments.forEach(visit);
}
visitLetPrim(cps_ir.LetPrim exp) {
@@ -460,6 +465,10 @@ class BlockCollector extends cps_ir.Visitor {
}
}
+ visitInvokeContinuation(cps_ir.InvokeContinuation exp) {
+ addEdgeToContinuation(exp.continuation);
+ }
+
visitInvokeStatic(cps_ir.InvokeStatic exp) {
addEdgeToContinuation(exp.continuation);
}
@@ -468,15 +477,15 @@ class BlockCollector extends cps_ir.Visitor {
addEdgeToContinuation(exp.continuation);
}
- visitInvokeConstructor(cps_ir.InvokeConstructor exp) {
+ visitInvokeMethodDirectly(cps_ir.InvokeMethodDirectly exp) {
addEdgeToContinuation(exp.continuation);
}
- visitConcatenateStrings(cps_ir.ConcatenateStrings exp) {
+ visitInvokeConstructor(cps_ir.InvokeConstructor exp) {
addEdgeToContinuation(exp.continuation);
}
- visitInvokeContinuation(cps_ir.InvokeContinuation exp) {
+ visitConcatenateStrings(cps_ir.ConcatenateStrings exp) {
addEdgeToContinuation(exp.continuation);
}
@@ -503,10 +512,66 @@ class BlockCollector extends cps_ir.Visitor {
}
}
+ visitTypeOperator(cps_ir.TypeOperator exp) {
+ addEdgeToContinuation(exp.continuation);
+ }
+
visitContinuation(cps_ir.Continuation c) {
var old_node = current_block;
current_block = getBlock(c);
visit(c.body);
current_block = old_node;
}
+
+ // Primitives and conditions are not visited when searching for blocks.
+ unexpectedNode(cps_ir.Node node) {
+ throw "The IR tracer's block collector reached an unexpected IR "
+ "instruction: $node";
+ }
+
+ visitLiteralList(cps_ir.LiteralList node) {
+ unexpectedNode(node);
+ }
+ visitLiteralMap(cps_ir.LiteralMap node) {
+ unexpectedNode(node);
+ }
+ visitConstant(cps_ir.Constant node) {
+ unexpectedNode(node);
+ }
+ visitThis(cps_ir.This node) {
+ unexpectedNode(node);
+ }
+ visitReifyTypeVar(cps_ir.ReifyTypeVar node) {
+ unexpectedNode(node);
+ }
+ visitCreateFunction(cps_ir.CreateFunction node) {
+ unexpectedNode(node);
+ }
+ visitGetMutableVariable(cps_ir.GetMutableVariable node) {
+ unexpectedNode(node);
+ }
+ visitParameter(cps_ir.Parameter node) {
+ unexpectedNode(node);
+ }
+ visitMutableVariable(cps_ir.MutableVariable node) {
+ unexpectedNode(node);
+ }
+ visitGetField(cps_ir.GetField node) {
+ unexpectedNode(node);
+ }
+ visitCreateBox(cps_ir.CreateBox node) {
+ unexpectedNode(node);
+ }
+ visitCreateInstance(cps_ir.CreateInstance node) {
+ unexpectedNode(node);
+ }
+ visitIsTrue(cps_ir.IsTrue node) {
+ unexpectedNode(node);
+ }
+ visitIdentical(cps_ir.Identical node) {
+ unexpectedNode(node);
+ }
+ visitInterceptor(cps_ir.Interceptor node) {
+ unexpectedNode(node);
+ }
}
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart ('k') | pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698