| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
|
| index c2920361cc061daa33de32097a11b7f51eb95ff3..e800a5c94fe28ee1d877dc305e3b87795dfaa1cc 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
|
| @@ -175,32 +175,37 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
|
| });
|
| }
|
|
|
| + ir.FunctionDefinition _makeFunctionBody(FunctionElement element,
|
| + ast.FunctionExpression node) {
|
| + FunctionSignature signature = element.functionSignature;
|
| + signature.orderedForEachParameter((ParameterElement parameterElement) {
|
| + irBuilder.createFunctionParameter(parameterElement);
|
| + });
|
| +
|
| + List<ConstantExpression> defaults = new List<ConstantExpression>();
|
| + signature.orderedOptionalParameters.forEach((ParameterElement element) {
|
| + defaults.add(getConstantForVariable(element));
|
| + });
|
| +
|
| + visit(node.body);
|
| +
|
| + return irBuilder.makeFunctionDefinition(defaults);
|
| + }
|
| +
|
| ir.FunctionDefinition buildFunction(FunctionElement element) {
|
| assert(invariant(element, element.isImplementation));
|
| - ast.FunctionExpression function = element.node;
|
| - assert(function != null);
|
| - assert(elements[function] != null);
|
| + ast.FunctionExpression node = element.node;
|
| + assert(node != null);
|
| + assert(elements[node] != null);
|
|
|
| DetectClosureVariables closureLocals = new DetectClosureVariables(elements);
|
| - closureLocals.visit(function);
|
| -
|
| - return withBuilder(
|
| - new IrBuilder(compiler.backend.constantSystem,
|
| - element, closureLocals.usedFromClosure),
|
| - () {
|
| - FunctionSignature signature = element.functionSignature;
|
| - signature.orderedForEachParameter((ParameterElement parameterElement) {
|
| - irBuilder.createParameter(parameterElement);
|
| - });
|
| + closureLocals.visit(node);
|
|
|
| - List<ConstantExpression> defaults = new List<ConstantExpression>();
|
| - signature.orderedOptionalParameters.forEach((ParameterElement element) {
|
| - defaults.add(getConstantForVariable(element));
|
| - });
|
| + IrBuilder builder = new IrBuilder(compiler.backend.constantSystem,
|
| + element,
|
| + closureLocals.usedFromClosure);
|
|
|
| - visit(function.body);
|
| - return irBuilder.makeFunctionDefinition(defaults);
|
| - });
|
| + return withBuilder(builder, () => _makeFunctionBody(element, node));
|
| }
|
|
|
| ir.Primitive visit(ast.Node node) => node.accept(this);
|
| @@ -844,7 +849,12 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
|
| }
|
|
|
| ir.FunctionDefinition makeSubFunction(ast.FunctionExpression node) {
|
| - return buildFunction(elements[node]);
|
| + FunctionElement element = elements[node];
|
| + assert(invariant(element, element.isImplementation));
|
| +
|
| + IrBuilder builder = new IrBuilder.innerFunction(irBuilder, element);
|
| +
|
| + return withBuilder(builder, () => _makeFunctionBody(element, node));
|
| }
|
|
|
| ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
|
|
|