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 cb6a80e349b7a9578bf38d2a131d3739648371f4..dd7e4ffb40e25667d6749775aba1241b485087ef 100644 |
--- a/pkg/compiler/lib/src/ssa/builder.dart |
+++ b/pkg/compiler/lib/src/ssa/builder.dart |
@@ -327,8 +327,8 @@ class LocalsHandler { |
void startFunction(AstElement element, ast.Node node) { |
assert(invariant(element, element.isImplementation)); |
Compiler compiler = builder.compiler; |
- closureData = compiler.closureToClassMapper |
- .computeClosureToClassMapping(element.resolvedAst); |
+ closureData = compiler.closureToClassMapper.computeClosureToClassMapping( |
+ compiler.backend.frontend.getResolvedAst(element.declaration)); |
if (element is FunctionElement) { |
FunctionElement functionElement = element; |
@@ -457,7 +457,8 @@ class LocalsHandler { |
builder.reporter.internalError(builder.compiler.currentElement, |
"Runtime type information not available for $local."); |
} else { |
- builder.reporter.internalError(local, "Cannot find value $local."); |
+ builder.reporter.internalError( |
+ local, "Cannot find value $local in ${directLocals.keys}."); |
} |
} |
HInstruction value = directLocals[local]; |
@@ -1377,6 +1378,7 @@ class SsaBuilder extends ast.Visitor |
if (compiler.elementHasCompileTimeError(element)) return false; |
FunctionElement function = element; |
+ ResolvedAst functionResolvedAst = backend.frontend.getResolvedAst(function); |
bool insideLoop = loopNesting > 0 || graph.calledInLoop; |
// Bail out early if the inlining decision is in the cache and we can't |
@@ -1436,7 +1438,7 @@ class SsaBuilder extends ast.Visitor |
bool doesNotContainCode() { |
// A function with size 1 does not contain any code. |
- return InlineWeeder.canBeInlined(function, 1, true, |
+ return InlineWeeder.canBeInlined(functionResolvedAst, 1, true, |
enableUserAssertions: compiler.options.enableUserAssertions); |
} |
@@ -1444,7 +1446,7 @@ class SsaBuilder extends ast.Visitor |
// The call is on a path which is executed rarely, so inline only if it |
// does not make the program larger. |
if (isCalledOnce(element)) { |
- return InlineWeeder.canBeInlined(function, -1, false, |
+ return InlineWeeder.canBeInlined(functionResolvedAst, -1, false, |
enableUserAssertions: compiler.options.enableUserAssertions); |
} |
// TODO(sra): Measure if inlining would 'reduce' the size. One desirable |
@@ -1482,7 +1484,7 @@ class SsaBuilder extends ast.Visitor |
if (cachedCanBeInlined == true) { |
// We may have forced the inlining of some methods. Therefore check |
// if we can inline this method regardless of size. |
- assert(InlineWeeder.canBeInlined(function, -1, false, |
+ assert(InlineWeeder.canBeInlined(functionResolvedAst, -1, false, |
allowLoops: true, |
enableUserAssertions: compiler.options.enableUserAssertions)); |
return true; |
@@ -1507,7 +1509,7 @@ class SsaBuilder extends ast.Visitor |
} |
bool canInline; |
canInline = InlineWeeder.canBeInlined( |
- function, maxInliningNodes, useMaxInliningNodes, |
+ functionResolvedAst, maxInliningNodes, useMaxInliningNodes, |
enableUserAssertions: compiler.options.enableUserAssertions); |
if (canInline) { |
backend.inlineCache.markAsInlinable(element, insideLoop: insideLoop); |
@@ -1531,7 +1533,7 @@ class SsaBuilder extends ast.Visitor |
} |
List<HInstruction> compiledArguments = completeSendArgumentsList( |
function, selector, providedArguments, currentNode); |
- enterInlinedMethod(function, currentNode, compiledArguments, |
+ enterInlinedMethod(function, functionResolvedAst, compiledArguments, |
instanceType: instanceType); |
inlinedFrom(function, () { |
if (!isReachable) { |
@@ -1678,7 +1680,7 @@ class SsaBuilder extends ast.Visitor |
HGraph buildMethod(FunctionElement functionElement) { |
assert(invariant(functionElement, functionElement.isImplementation)); |
graph.calledInLoop = compiler.world.isCalledInLoop(functionElement); |
- ast.FunctionExpression function = functionElement.node; |
+ ast.FunctionExpression function = resolvedAst.node; |
assert(function != null); |
assert(elements.getFunctionDefinition(function) != null); |
openFunction(functionElement, function); |
@@ -1832,9 +1834,12 @@ class SsaBuilder extends ast.Visitor |
void setupStateForInlining( |
FunctionElement function, List<HInstruction> compiledArguments, |
{InterfaceType instanceType}) { |
+ ResolvedAst resolvedAst = |
+ compiler.backend.frontend.getResolvedAst(function.declaration); |
+ assert(resolvedAst != null); |
localsHandler = new LocalsHandler(this, function, instanceType); |
- localsHandler.closureData = compiler.closureToClassMapper |
- .computeClosureToClassMapping(function.resolvedAst); |
+ localsHandler.closureData = |
+ compiler.closureToClassMapper.computeClosureToClassMapping(resolvedAst); |
returnLocal = new SyntheticLocal("result", function); |
localsHandler.updateLocal(returnLocal, graph.addConstantNull(compiler)); |
@@ -1863,8 +1868,6 @@ class SsaBuilder extends ast.Visitor |
} |
assert(argumentIndex == compiledArguments.length); |
- resolvedAst = function.resolvedAst; |
- assert(resolvedAst != null); |
returnType = signature.type.returnType; |
stack = <HInstruction>[]; |
@@ -2008,7 +2011,7 @@ class SsaBuilder extends ast.Visitor |
// Build the initializers in the context of the new constructor. |
ResolvedAst oldResolvedAst = resolvedAst; |
- resolvedAst = callee.resolvedAst; |
+ resolvedAst = backend.frontend.getResolvedAst(callee); |
ClosureClassMap oldClosureData = localsHandler.closureData; |
ClosureClassMap newClosureData = compiler.closureToClassMapper |
.computeClosureToClassMapping(resolvedAst); |
@@ -2175,7 +2178,7 @@ class SsaBuilder extends ast.Visitor |
} else { |
ast.Node right = initializer; |
ResolvedAst savedResolvedAst = resolvedAst; |
- resolvedAst = member.resolvedAst; |
+ resolvedAst = backend.frontend.getResolvedAst(member); |
// In case the field initializer uses closures, run the |
// closure to class mapper. |
compiler.closureToClassMapper |
@@ -2382,7 +2385,7 @@ class SsaBuilder extends ast.Visitor |
bodyCallInputs.add(interceptor); |
} |
bodyCallInputs.add(newObject); |
- ResolvedAst resolvedAst = constructor.resolvedAst; |
+ ResolvedAst resolvedAst = backend.frontend.getResolvedAst(constructor); |
ast.Node node = resolvedAst.node; |
ClosureClassMap parameterClosureData = |
compiler.closureToClassMapper.getMappingForNestedFunction(node); |
@@ -7879,8 +7882,8 @@ class SsaBuilder extends ast.Visitor |
* This method is invoked before inlining the body of [function] into this |
* [SsaBuilder]. |
*/ |
- void enterInlinedMethod(FunctionElement function, ast.Node _, |
- List<HInstruction> compiledArguments, |
+ void enterInlinedMethod(FunctionElement function, |
+ ResolvedAst functionResolvedAst, List<HInstruction> compiledArguments, |
{InterfaceType instanceType}) { |
AstInliningState state = new AstInliningState( |
function, |
@@ -7891,6 +7894,7 @@ class SsaBuilder extends ast.Visitor |
localsHandler, |
inTryStatement, |
allInlinedFunctionsCalledOnce && isFunctionCalledOnce(function)); |
+ resolvedAst = functionResolvedAst; |
inliningStack.add(state); |
// Setting up the state of the (AST) builder is performed even when the |
@@ -8087,14 +8091,14 @@ class InlineWeeder extends ast.Visitor { |
this.enableUserAssertions); |
static bool canBeInlined( |
- FunctionElement function, int maxInliningNodes, bool useMaxInliningNodes, |
+ ResolvedAst resolvedAst, int maxInliningNodes, bool useMaxInliningNodes, |
{bool allowLoops: false, bool enableUserAssertions: null}) { |
assert(enableUserAssertions is bool); // Ensure we passed it. |
- if (function.resolvedAst.elements.containsTryStatement) return false; |
+ if (resolvedAst.elements.containsTryStatement) return false; |
InlineWeeder weeder = new InlineWeeder(maxInliningNodes, |
useMaxInliningNodes, allowLoops, enableUserAssertions); |
- ast.FunctionExpression functionExpression = function.node; |
+ ast.FunctionExpression functionExpression = resolvedAst.node; |
weeder.visit(functionExpression.initializers); |
weeder.visit(functionExpression.body); |
weeder.visit(functionExpression.asyncModifier); |