Index: tests/compiler/dart2js/closure/closure_test.dart |
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart |
index b258e500cab6527ad40690b39d12b8cb638614c4..260d3707bff2dd4056d1f52f6d110f5b79f5b74e 100644 |
--- a/tests/compiler/dart2js/closure/closure_test.dart |
+++ b/tests/compiler/dart2js/closure/closure_test.dart |
@@ -90,15 +90,15 @@ class ClosureAstComputer extends AbstractResolvedAstComputer |
ResolvedAst resolvedAst, this.closureDataLookup, |
{this.verbose: false}) |
: super(reporter, actualMap, resolvedAst) { |
- push(resolvedAst.element); |
+ pushMember(resolvedAst.element as MemberElement); |
} |
visitFunctionExpression(ast.FunctionExpression node) { |
Entity localFunction = resolvedAst.elements.getFunctionDefinition(node); |
if (localFunction is LocalFunctionElement) { |
- push(localFunction); |
+ pushLocalFunction(node); |
super.visitFunctionExpression(node); |
- pop(); |
+ popLocalFunction(); |
} else { |
super.visitFunctionExpression(node); |
} |
@@ -129,6 +129,7 @@ class ClosureAstComputer extends AbstractResolvedAstComputer |
/// Kernel IR visitor for computing closure data. |
class ClosureIrChecker extends AbstractIrComputer |
with ComputeValueMixin<ir.Node> { |
+ final MemberEntity member; |
final ClosureDataLookup<ir.Node> closureDataLookup; |
final KernelToLocalsMap _localsMap; |
final bool verbose; |
@@ -136,26 +137,24 @@ class ClosureIrChecker extends AbstractIrComputer |
ClosureIrChecker( |
Map<Id, ActualData> actualMap, |
KernelToElementMapForBuilding elementMap, |
- MemberEntity member, |
+ this.member, |
this._localsMap, |
this.closureDataLookup, |
{this.verbose: false}) |
: super(actualMap) { |
- push(member); |
+ pushMember(member); |
} |
visitFunctionExpression(ir.FunctionExpression node) { |
- Local localFunction = _localsMap.getLocalFunction(node); |
- push(localFunction); |
+ pushLocalFunction(node); |
super.visitFunctionExpression(node); |
- pop(); |
+ popLocalFunction(); |
} |
visitFunctionDeclaration(ir.FunctionDeclaration node) { |
- Local localFunction = _localsMap.getLocalFunction(node); |
- push(localFunction); |
+ pushLocalFunction(node); |
super.visitFunctionDeclaration(node); |
- pop(); |
+ popLocalFunction(); |
} |
@override |
@@ -169,18 +168,16 @@ class ClosureIrChecker extends AbstractIrComputer |
} |
@override |
- String computeMemberValue(ir.Member member) { |
+ String computeMemberValue(ir.Member node) { |
// TODO(johnniwinther,efortuna): Collect data for the member |
// (has thisLocal, has box, etc.). |
- return computeEntityValue(entity); |
+ return computeEntityValue(member); |
} |
} |
abstract class ComputeValueMixin<T> { |
bool get verbose; |
ClosureDataLookup<T> get closureDataLookup; |
- Entity get entity => entityStack.head; |
- Link<Entity> entityStack = const Link<Entity>(); |
Link<ScopeInfo> scopeInfoStack = const Link<ScopeInfo>(); |
ScopeInfo get scopeInfo => scopeInfoStack.head; |
CapturedScope capturedScope; |
@@ -189,32 +186,40 @@ abstract class ComputeValueMixin<T> { |
ClosureRepresentationInfo get closureRepresentationInfo => |
closureRepresentationInfoStack.head; |
- void push(Entity entity) { |
- entityStack = entityStack.prepend(entity); |
+ void pushMember(MemberEntity member) { |
scopeInfoStack = |
- scopeInfoStack.prepend(closureDataLookup.getScopeInfo(entity)); |
- if (entity is MemberEntity) { |
- capturedScope = closureDataLookup.getCapturedScope(entity); |
- } |
- closureRepresentationInfoStack = closureRepresentationInfoStack.prepend( |
- closureDataLookup.getClosureRepresentationInfoForTesting(entity)); |
- dump(entity); |
+ scopeInfoStack.prepend(closureDataLookup.getScopeInfo(member)); |
+ capturedScope = closureDataLookup.getCapturedScope(member); |
+ closureRepresentationInfoStack = closureRepresentationInfoStack |
+ .prepend(closureDataLookup.getClosureInfoForMemberTesting(member)); |
+ dump(member); |
} |
- void pop() { |
- entityStack = entityStack.tail; |
+ void popMember() { |
scopeInfoStack = scopeInfoStack.tail; |
closureRepresentationInfoStack = closureRepresentationInfoStack.tail; |
} |
- void dump(Entity entity) { |
+ void pushLocalFunction(T node) { |
+ closureRepresentationInfoStack = closureRepresentationInfoStack |
+ .prepend(closureDataLookup.getClosureInfoForTesting(node)); |
+ dump(node); |
+ } |
+ |
+ void popLocalFunction() { |
+ closureRepresentationInfoStack = closureRepresentationInfoStack.tail; |
+ } |
+ |
+ void dump(Object object) { |
if (!verbose) return; |
- print('entity: $entity'); |
- print(' scopeInfo (${scopeInfo.runtimeType})'); |
- scopeInfo.forEachBoxedVariable((a, b) => print(' boxed1: $a->$b')); |
- print(' capturedScope (${capturedScope.runtimeType})'); |
- capturedScope.forEachBoxedVariable((a, b) => print(' boxed2: $a->$b')); |
+ print('object: $object'); |
+ if (object is MemberEntity) { |
+ print(' scopeInfo (${scopeInfo.runtimeType})'); |
+ scopeInfo.forEachBoxedVariable((a, b) => print(' boxed1: $a->$b')); |
+ print(' capturedScope (${capturedScope.runtimeType})'); |
+ capturedScope.forEachBoxedVariable((a, b) => print(' boxed2: $a->$b')); |
+ } |
print( |
' closureRepresentationInfo (${closureRepresentationInfo.runtimeType})'); |
closureRepresentationInfo |