Index: pkg/compiler/lib/src/ssa/builder.dart |
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart |
index 1fa39bcdd218b567d919c95b485e8b9dc76d62bc..7088c51c1ac09a52295b69bc07247e98f540f80d 100644 |
--- a/pkg/compiler/lib/src/ssa/builder.dart |
+++ b/pkg/compiler/lib/src/ssa/builder.dart |
@@ -1367,8 +1367,6 @@ class SsaBuilder extends ast.Visitor |
} |
bodyCallInputs.add(newObject); |
ast.Node node = constructorResolvedAst.node; |
- ClosureClassMap parameterClosureData = |
- closureToClassMapper.getMemberMap(constructor); |
FunctionSignature functionSignature = body.functionSignature; |
// Provide the parameters to the generative constructor body. |
@@ -1383,9 +1381,11 @@ class SsaBuilder extends ast.Visitor |
// If there are locals that escape (ie mutated in closures), we |
// pass the box to the constructor. |
// The box must be passed before any type variable. |
- ClosureScope scopeData = parameterClosureData.capturingScopes[node]; |
- if (scopeData != null) { |
- bodyCallInputs.add(localsHandler.readLocal(scopeData.boxElement)); |
+ CapturedVariableInfo scopeData = |
+ closureToClassMapper.getCapturedVariableInfo(node); |
+ if (scopeData.hasCapturedVariables()) { |
+ bodyCallInputs.add(localsHandler |
+ .readLocal(closureToClassMapper.getExecutableContext(node))); |
} |
// Type variables arguments must come after the box (if there is one). |
@@ -1460,11 +1460,11 @@ class SsaBuilder extends ast.Visitor |
// because that is where the type guards will also be inserted. |
// This way we ensure that a type guard will dominate the type |
// check. |
- ClosureScope scopeData = localsHandler.closureData.capturingScopes[node]; |
signature.orderedForEachParameter((ParameterElement parameterElement) { |
if (element.isGenerativeConstructorBody) { |
- if (scopeData != null && |
- scopeData.isCapturedVariable(parameterElement)) { |
+ if (closureToClassMapper |
+ .getCapturedVariableInfo(node) |
+ .isCaptured(parameterElement)) { |
// The parameter will be a field in the box passed as the |
// last parameter. So no need to have it. |
return; |
@@ -1861,25 +1861,22 @@ class SsaBuilder extends ast.Visitor |
visitFunctionExpression(ast.FunctionExpression node) { |
LocalFunctionElement methodElement = elements[node]; |
- ClosureClassMap nestedClosureData = |
- closureToClassMapper.getLocalFunctionMap(methodElement); |
- assert(nestedClosureData != null); |
- assert(nestedClosureData.closureClassElement != null); |
- ClosureClassElement closureClassElement = |
- nestedClosureData.closureClassElement; |
- MethodElement callElement = nestedClosureData.callElement; |
+ ClassEntity closureClassElement = |
+ closureToClassMapper.getClosureClassEntity(methodElement); |
List<HInstruction> capturedVariables = <HInstruction>[]; |
- closureClassElement.closureFields.forEach((ClosureFieldElement field) { |
+ closureToClassMapper.forEachClosureClassFieldEntity(methodElement, |
+ (ClosureFieldElement field) { |
Local capturedLocal = |
- nestedClosureData.getLocalVariableForClosureField(field); |
+ closureToClassMapper.getLocalVarForClosureField(methodElement, field); |
assert(capturedLocal != null); |
capturedVariables.add(localsHandler.readLocal(capturedLocal)); |
}); |
TypeMask type = new TypeMask.nonNullExact(closureClassElement, closedWorld); |
push(new HCreate(closureClassElement, capturedVariables, type, |
- callMethod: callElement, localFunction: methodElement) |
+ callMethod: closureToClassMapper.getCallEntity(methodElement), |
+ localFunction: methodElement) |
..sourceInformation = sourceInformationBuilder.buildCreate(node)); |
} |