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

Unified Diff: pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart

Issue 958603002: Added VariableUse expression to tree IR. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated docs regarding catch parameters 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/tree_ir/tree_ir_builder.dart
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index 5d3cb519d2b99e2a7fa4b14d1eb1a670c5344ce5..761689ac9a2311437db29788c27336345267fda5 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -91,14 +91,17 @@ class Builder extends cps_ir.Visitor<Node> {
return variable;
}
- Variable getMutableVariableReference(
- cps_ir.Reference<cps_ir.MutableVariable> reference) {
- if (reference.definition.host != currentElement) {
- return parent.getMutableVariableReference(reference);
+ Variable getMutableVariable(cps_ir.MutableVariable mutableVariable) {
+ if (mutableVariable.host != currentElement) {
+ return parent.getMutableVariable(mutableVariable);
}
- Variable variable = local2mutable[reference.definition];
- ++variable.readCount;
- return variable;
+ return local2mutable[mutableVariable];
+ }
+
+ VariableUse getMutableVariableUse(
+ cps_ir.Reference<cps_ir.MutableVariable> reference) {
+ Variable variable = getMutableVariable(reference.definition);
+ return new VariableUse(variable);
}
/// Obtains the variable representing the given primitive. Returns null for
@@ -119,15 +122,14 @@ class Builder extends cps_ir.Visitor<Node> {
/// referred to by [reference].
/// This increments the reference count for the given variable, so the
/// returned expression must be used in the tree.
- Expression getVariableReference(cps_ir.Reference reference) {
+ VariableUse getVariableUse(cps_ir.Reference<cps_ir.Primitive> reference) {
Variable variable = getVariable(reference.definition);
if (variable == null) {
internalError(
CURRENT_ELEMENT_SPANNABLE,
"Reference to ${reference.definition} has no register");
}
- ++variable.readCount;
- return variable;
+ return new VariableUse(variable);
}
ExecutableDefinition build(cps_ir.ExecutableDefinition node) {
@@ -168,14 +170,8 @@ class Builder extends cps_ir.Visitor<Node> {
FunctionDefinition buildFunction(cps_ir.FunctionDefinition node) {
currentElement = node.element;
- List<Variable> parameters = <Variable>[];
- for (cps_ir.Definition p in node.parameters) {
- Variable parameter = addFunctionParameter(p);
- assert(parameter != null);
- ++parameter.writeCount; // Being a parameter counts as a write.
- parameters.add(parameter);
- }
-
+ List<Variable> parameters =
+ node.parameters.map(addFunctionParameter).toList();
Statement body;
if (!node.isAbstract) {
returnContinuation = node.body.returnContinuation;
@@ -189,13 +185,8 @@ class Builder extends cps_ir.Visitor<Node> {
ConstructorDefinition buildConstructor(cps_ir.ConstructorDefinition node) {
currentElement = node.element;
- List<Variable> parameters = <Variable>[];
- for (cps_ir.Definition p in node.parameters) {
- Variable parameter = addFunctionParameter(p);
- assert(parameter != null);
- ++parameter.writeCount; // Being a parameter counts as a write.
- parameters.add(parameter);
- }
+ List<Variable> parameters =
+ node.parameters.map(addFunctionParameter).toList();
List<Initializer> initializers;
Statement body;
if (!node.isAbstract) {
@@ -219,7 +210,7 @@ class Builder extends cps_ir.Visitor<Node> {
/// on the list during the rewrite phases.
List<Expression> translateArguments(List<cps_ir.Reference> args) {
return new List<Expression>.generate(args.length,
- (int index) => getVariableReference(args[index]),
+ (int index) => getVariableUse(args[index]),
growable: false);
}
@@ -280,12 +271,10 @@ class Builder extends cps_ir.Visitor<Node> {
Statement first, current;
void addAssignment(Variable dst, Variable src) {
- ++src.readCount;
- // `dst.writeCount` will be updated by the Assign constructor.
if (first == null) {
- first = current = new Assign(dst, src, null);
+ first = current = new Assign(dst, new VariableUse(src), null);
} else {
- current = current.next = new Assign(dst, src, null);
+ current = current.next = new Assign(dst, new VariableUse(src), null);
}
}
@@ -433,14 +422,14 @@ class Builder extends cps_ir.Visitor<Node> {
}
Statement visitInvokeMethod(cps_ir.InvokeMethod node) {
- Expression invoke = new InvokeMethod(getVariableReference(node.receiver),
+ Expression invoke = new InvokeMethod(getVariableUse(node.receiver),
node.selector,
translateArguments(node.arguments));
return continueWithExpression(node.continuation, invoke);
}
Statement visitInvokeMethodDirectly(cps_ir.InvokeMethodDirectly node) {
- Expression receiver = getVariableReference(node.receiver);
+ Expression receiver = getVariableUse(node.receiver);
List<Expression> arguments = translateArguments(node.arguments);
Expression invoke = new InvokeMethodDirectly(receiver, node.target,
node.selector, arguments);
@@ -469,17 +458,17 @@ class Builder extends cps_ir.Visitor<Node> {
Statement visitLetMutable(cps_ir.LetMutable node) {
Variable variable = addMutableVariable(node.variable);
- Expression value = getVariableReference(node.value);
+ Expression value = getVariableUse(node.value);
return new Assign(variable, value, visit(node.body), isDeclaration: true);
}
Expression visitGetMutableVariable(cps_ir.GetMutableVariable node) {
- return getMutableVariableReference(node.variable);
+ return getMutableVariableUse(node.variable);
}
Statement visitSetMutableVariable(cps_ir.SetMutableVariable node) {
- Variable variable = getMutableVariableReference(node.variable);
- Expression value = getVariableReference(node.value);
+ Variable variable = getMutableVariable(node.variable.definition);
+ Expression value = getVariableUse(node.value);
return new Assign(variable, value, visit(node.body));
}
@@ -490,7 +479,7 @@ class Builder extends cps_ir.Visitor<Node> {
}
Statement visitTypeOperator(cps_ir.TypeOperator node) {
- Expression receiver = getVariableReference(node.receiver);
+ Expression receiver = getVariableUse(node.receiver);
Expression concat =
new TypeOperator(receiver, node.type, isTypeTest: node.isTypeTest);
return continueWithExpression(node.continuation, concat);
@@ -512,9 +501,9 @@ class Builder extends cps_ir.Visitor<Node> {
cps_ir.Continuation cont = node.continuation.definition;
if (cont == returnContinuation) {
assert(node.arguments.length == 1);
- return new Return(getVariableReference(node.arguments.single));
+ return new Return(getVariableUse(node.arguments.single));
} else {
- List<Expression> arguments = translatePhiArguments(node.arguments);
+ List<Variable> arguments = translatePhiArguments(node.arguments);
return buildPhiAssignments(cont.parameters, arguments,
() {
// Translate invocations of recursive and non-recursive
@@ -582,8 +571,8 @@ class Builder extends cps_ir.Visitor<Node> {
node.type,
new List<LiteralMapEntry>.generate(node.entries.length, (int index) {
return new LiteralMapEntry(
- getVariableReference(node.entries[index].key),
- getVariableReference(node.entries[index].value));
+ getVariableUse(node.entries[index].key),
+ getVariableUse(node.entries[index].value));
})
);
}
@@ -620,7 +609,7 @@ class Builder extends cps_ir.Visitor<Node> {
}
Expression visitIsTrue(cps_ir.IsTrue node) {
- return getVariableReference(node.value);
+ return getVariableUse(node.value);
}
}
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart ('k') | pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698