| 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 c983a42fb16efaeb2037ea8f917276adc5be735b..77e7ea355d81f994af6153a76344b41f24025345 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
|
| @@ -57,7 +57,7 @@ class Builder extends cps_ir.Visitor<Node> {
|
| // is the mapping from continuations to labels.
|
| final Map<cps_ir.Continuation, Label> labels = <cps_ir.Continuation, Label>{};
|
|
|
| - FunctionDefinition function;
|
| + ExecutableElement currentElement;
|
| cps_ir.Continuation returnContinuation;
|
|
|
| Builder parent;
|
| @@ -73,12 +73,12 @@ class Builder extends cps_ir.Visitor<Node> {
|
| Variable phiTempVar;
|
|
|
| Variable getClosureVariable(Local local) {
|
| - if (local.executableContext != function.element) {
|
| + if (local.executableContext != currentElement) {
|
| return parent.getClosureVariable(local);
|
| }
|
| Variable variable = local2closure[local];
|
| if (variable == null) {
|
| - variable = new Variable(function, local);
|
| + variable = new Variable(currentElement, local);
|
| local2closure[local] = variable;
|
| }
|
| return variable;
|
| @@ -96,7 +96,7 @@ class Builder extends cps_ir.Visitor<Node> {
|
| element2variables[primitive.hint] = variables;
|
| }
|
| while (variables.length <= primitive.registerIndex) {
|
| - variables.add(new Variable(function, primitive.hint));
|
| + variables.add(new Variable(currentElement, primitive.hint));
|
| }
|
| return variables[primitive.registerIndex];
|
| }
|
| @@ -116,9 +116,43 @@ class Builder extends cps_ir.Visitor<Node> {
|
| return variable;
|
| }
|
|
|
| - FunctionDefinition build(cps_ir.FunctionDefinition node) {
|
| - visit(node);
|
| - return function;
|
| + ExecutableDefinition build(cps_ir.ExecutableDefinition node) {
|
| + if (node is cps_ir.FieldDefinition) {
|
| + return buildField(node);
|
| + } else if (node is cps_ir.FunctionDefinition) {
|
| + return buildFunction(node);
|
| + }
|
| + assert(false);
|
| + }
|
| +
|
| + FieldDefinition buildField(cps_ir.FieldDefinition node) {
|
| + currentElement = node.element;
|
| + returnContinuation = node.returnContinuation;
|
| +
|
| + phiTempVar = new Variable(node.element, null);
|
| +
|
| + return new FieldDefinition(node.element, visit(node.body));
|
| + }
|
| +
|
| + 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);
|
| + assert(parameter != null);
|
| + ++parameter.writeCount; // Being a parameter counts as a write.
|
| + parameters.add(parameter);
|
| + }
|
| + returnContinuation = node.returnContinuation;
|
| +
|
| + Statement body;
|
| + if (!node.isAbstract) {
|
| + phiTempVar = new Variable(node.element, null);
|
| + body = visit(node.body);
|
| + }
|
| +
|
| + return new FunctionDefinition(node.element, parameters,
|
| + body, node.localConstants, node.defaultParameterValues);
|
| }
|
|
|
| List<Expression> translateArguments(List<cps_ir.Reference> args) {
|
| @@ -232,24 +266,6 @@ class Builder extends cps_ir.Visitor<Node> {
|
|
|
| visitNode(cps_ir.Node node) => throw "Unhandled node: $node";
|
|
|
| - Expression visitFunctionDefinition(cps_ir.FunctionDefinition node) {
|
| - List<Variable> parameters = <Variable>[];
|
| - function = new FunctionDefinition(node.element, parameters,
|
| - null, node.localConstants, node.defaultParameterValues);
|
| - returnContinuation = node.returnContinuation;
|
| - for (cps_ir.Parameter p in node.parameters) {
|
| - Variable parameter = getVariable(p);
|
| - assert(parameter != null);
|
| - ++parameter.writeCount; // Being a parameter counts as a write.
|
| - parameters.add(parameter);
|
| - }
|
| - if (!node.isAbstract) {
|
| - phiTempVar = new Variable(function, null);
|
| - function.body = visit(node.body);
|
| - }
|
| - return null;
|
| - }
|
| -
|
| Statement visitLetPrim(cps_ir.LetPrim node) {
|
| Variable variable = getVariable(node.primitive);
|
|
|
| @@ -440,7 +456,7 @@ class Builder extends cps_ir.Visitor<Node> {
|
| }
|
|
|
| FunctionDefinition makeSubFunction(cps_ir.FunctionDefinition function) {
|
| - return new Builder.inner(this).build(function);
|
| + return new Builder.inner(this).buildFunction(function);
|
| }
|
|
|
| Node visitCreateFunction(cps_ir.CreateFunction node) {
|
|
|