Chromium Code Reviews| 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 99e6aa5a02d3b4b83b10c6d8cd602ab3570d3099..eb39923f58d657892d10a6192eb2a049fffaabdc 100644 |
| --- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart |
| +++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart |
| @@ -49,9 +49,9 @@ class Builder extends cps_ir.Visitor<Node> { |
| final Map<Element, List<Variable>> element2variables = |
| <Element,List<Variable>>{}; |
| - /// Like [element2variables], except for closure variables. Closure variables |
| - /// are not subject to SSA, so at most one variable is used per local. |
| - final Map<Local, Variable> local2closure = <Local, Variable>{}; |
| + /// Like [element2variables], except for closure variables. |
| + final Map<cps_ir.ClosureVariable, Variable> local2closure = |
| + <cps_ir.ClosureVariable, Variable>{}; |
| // Continuations with more than one use are replaced with Tree labels. This |
| // is the mapping from continuations to labels. |
| @@ -72,14 +72,14 @@ class Builder extends cps_ir.Visitor<Node> { |
| /// variables. |
| Variable phiTempVar; |
| - Variable getClosureVariable(Local local) { |
| - if (local.executableContext != currentElement) { |
| - return parent.getClosureVariable(local); |
| + Variable getClosureVariable(cps_ir.ClosureVariable irVariable) { |
| + if (irVariable.host != currentElement) { |
| + return parent.getClosureVariable(irVariable); |
| } |
| - Variable variable = local2closure[local]; |
| + Variable variable = local2closure[irVariable]; |
|
Johnni Winther
2014/12/08 13:15:13
This could be rewritten as a putIfAbsent.
asgerf
2014/12/08 13:44:00
Done.
|
| if (variable == null) { |
| - variable = new Variable(currentElement, local); |
| - local2closure[local] = variable; |
| + variable = new Variable(currentElement, irVariable.hint); |
| + local2closure[irVariable] = variable; |
| } |
| return variable; |
| } |
| @@ -138,11 +138,19 @@ class Builder extends cps_ir.Visitor<Node> { |
| return new FieldDefinition(node.element, body); |
| } |
| + Variable getFunctionParameter(cps_ir.Definition variable) { |
| + if (variable is cps_ir.Parameter) { |
| + return getVariable(variable); |
| + } else { |
| + return getClosureVariable(variable as cps_ir.ClosureVariable); |
| + } |
| + } |
| + |
| FunctionDefinition buildFunction(cps_ir.FunctionDefinition node) { |
| currentElement = node.element; |
| List<Variable> parameters = <Variable>[]; |
| - for (cps_ir.Parameter p in node.parameters) { |
| - Variable parameter = getVariable(p); |
| + for (cps_ir.Definition p in node.parameters) { |
| + Variable parameter = getFunctionParameter(p); |
| assert(parameter != null); |
| ++parameter.writeCount; // Being a parameter counts as a write. |
| parameters.add(parameter); |
| @@ -348,18 +356,18 @@ class Builder extends cps_ir.Visitor<Node> { |
| } |
| Expression visitGetClosureVariable(cps_ir.GetClosureVariable node) { |
| - return getClosureVariable(node.variable); |
| + return getClosureVariable(node.variable.definition); |
| } |
| Statement visitSetClosureVariable(cps_ir.SetClosureVariable node) { |
| - Variable variable = getClosureVariable(node.variable); |
| + Variable variable = getClosureVariable(node.variable.definition); |
| Expression value = getVariableReference(node.value); |
| return new Assign(variable, value, visit(node.body), |
| isDeclaration: node.isDeclaration); |
| } |
| Statement visitDeclareFunction(cps_ir.DeclareFunction node) { |
| - Variable variable = getClosureVariable(node.variable); |
| + Variable variable = getClosureVariable(node.variable.definition); |
| FunctionDefinition function = makeSubFunction(node.definition); |
| return new FunctionDeclaration(variable, function, visit(node.body)); |
| } |