| Index: pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| index 925ea87522b3f7cf0274ccb61b3230c39974e147..0924b9317ac29be0e89e604700c917bd4d1ef428 100644
|
| --- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| +++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| @@ -45,8 +45,8 @@ import 'type_builder.dart';
|
| import 'types.dart' show TypeMaskFactory;
|
|
|
| class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| - ir.Node target;
|
| - bool _targetIsConstructorBody = false;
|
| + final ir.Node target;
|
| + final bool _targetIsConstructorBody;
|
| final MemberEntity targetElement;
|
|
|
| /// The root node of [targetElement]. This is used as the key into the
|
| @@ -56,6 +56,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| final Node functionNode;
|
| final ClosedWorld closedWorld;
|
| final CodegenRegistry registry;
|
| + final ClosureClassMaps closureToClassMapper;
|
|
|
| /// Helper accessor for all kernel function-like targets (Procedure,
|
| /// FunctionExpression, FunctionDeclaration) of the inner FunctionNode itself.
|
| @@ -97,14 +98,18 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
|
|
| KernelSsaBuilder(
|
| this.targetElement,
|
| + this.target,
|
| this.compiler,
|
| this._elementMap,
|
| this._typeInferenceMap,
|
| this.closedWorld,
|
| this.registry,
|
| + this.closureToClassMapper,
|
| // TODO(het): Should sourceInformationBuilder be in GraphBuilder?
|
| this.sourceInformationBuilder,
|
| - this.functionNode) {
|
| + this.functionNode,
|
| + {bool targetIsConstructorBody: false})
|
| + : this._targetIsConstructorBody = targetIsConstructorBody {
|
| this.loopHandler = new KernelLoopHandler(this);
|
| typeBuilder = new TypeBuilder(this);
|
| graph.element = targetElement;
|
| @@ -112,10 +117,6 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| sourceInformationBuilder.buildVariableDeclaration();
|
| this.localsHandler = new LocalsHandler(this, targetElement, targetElement,
|
| targetElement.enclosingClass, null, nativeData, interceptorData);
|
| - target = astAdapter.getInitialKernelNode(targetElement);
|
| - if (targetElement is ConstructorBodyElement) {
|
| - _targetIsConstructorBody = true;
|
| - }
|
| _targetStack.add(target);
|
| }
|
|
|
| @@ -314,8 +315,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| // arguments.
|
|
|
| ConstructorElement constructorElement = astAdapter.getElement(body);
|
| - ClosureClassMap parameterClosureData = closureToClassMapper
|
| - .getClosureToClassMapping(constructorElement.resolvedAst);
|
| + ClosureClassMap parameterClosureData =
|
| + closureToClassMapper.getMemberMap(constructorElement);
|
|
|
| var functionSignature = astAdapter.getFunctionSignature(body.function);
|
| // Provide the parameters to the generative constructor body.
|
| @@ -583,15 +584,15 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
|
|
| // Set the locals handler state as if we were inlining the constructor.
|
| astAdapter.pushResolvedAst(constructor);
|
| - AstElement astElement = astAdapter.getElement(constructor);
|
| + ConstructorElement astElement = astAdapter.getElement(constructor);
|
| ResolvedAst resolvedAst = astElement.resolvedAst;
|
| ClosureClassMap oldClosureData = localsHandler.closureData;
|
| ClosureClassMap newClosureData =
|
| - compiler.closureToClassMapper.getClosureToClassMapping(resolvedAst);
|
| + closureToClassMapper.getMemberMap(astElement);
|
| localsHandler.closureData = newClosureData;
|
| if (resolvedAst.kind == ResolvedAstKind.PARSED) {
|
| - localsHandler.enterScope(
|
| - resolvedAst.node, astAdapter.getElement(constructor));
|
| + localsHandler.enterScope(resolvedAst.node,
|
| + forGenerativeConstructorBody: astElement.isGenerativeConstructorBody);
|
| }
|
| inlinedFrom(constructor, () {
|
| _buildInitializers(constructor, constructorChain, fieldValues);
|
| @@ -663,7 +664,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| HBasicBlock block = graph.addNewBlock();
|
| open(graph.entry);
|
|
|
| - localsHandler.startFunction(targetElement, functionNode);
|
| + localsHandler.startFunction(targetElement, functionNode,
|
| + isGenerativeConstructorBody: _targetIsConstructorBody);
|
| close(new HGoto()).addSuccessor(block);
|
|
|
| open(block);
|
| @@ -720,7 +722,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| Element callMethodOfClosureClass() {
|
| LocalFunctionElement element = astAdapter.getElement(target);
|
| ClosureClassMap classMap =
|
| - closureToClassMapper.getClosureToClassMapping(element.resolvedAst);
|
| + closureToClassMapper.getLocalFunctionMap(element);
|
| return classMap.callElement;
|
| }
|
|
|
| @@ -2243,7 +2245,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| @override
|
| void visitStaticInvocation(ir.StaticInvocation invocation) {
|
| ir.Procedure target = invocation.target;
|
| - if (astAdapter.isForeignLibrary(target.enclosingLibrary)) {
|
| + if (_elementMap.isForeignLibrary(target.enclosingLibrary)) {
|
| handleInvokeStaticForeign(invocation, target);
|
| return;
|
| }
|
| @@ -2755,8 +2757,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| @override
|
| visitFunctionNode(ir.FunctionNode node) {
|
| LocalFunctionElement methodElement = astAdapter.getElement(node);
|
| - ClosureClassMap nestedClosureData = closureToClassMapper
|
| - .getClosureToClassMapping(methodElement.resolvedAst);
|
| + ClosureClassMap nestedClosureData =
|
| + closureToClassMapper.getLocalFunctionMap(methodElement);
|
| assert(nestedClosureData != null);
|
| assert(nestedClosureData.closureClassElement != null);
|
| ClosureClassElement closureClassElement =
|
|
|