| Index: pkg/compiler/lib/src/js_model/closure_visitors.dart
|
| diff --git a/pkg/compiler/lib/src/js_model/closure_visitors.dart b/pkg/compiler/lib/src/js_model/closure_visitors.dart
|
| index b6e7d3ba64262a0af859bdbec9c9516ae3f06180..ed482e7a669ab07c3fe3c28a24910ac1ae139a85 100644
|
| --- a/pkg/compiler/lib/src/js_model/closure_visitors.dart
|
| +++ b/pkg/compiler/lib/src/js_model/closure_visitors.dart
|
| @@ -11,8 +11,6 @@ import 'closure.dart';
|
| /// various points to build CapturedScope that can respond to queries
|
| /// about how a particular variable is being used at any point in the code.
|
| class CapturedScopeBuilder extends ir.Visitor {
|
| - ir.TreeNode _currentLocalFunction;
|
| -
|
| ScopeModel _model;
|
|
|
| /// A map of each visited call node with the associated information about what
|
| @@ -70,7 +68,7 @@ class CapturedScopeBuilder extends ir.Visitor {
|
|
|
| /// Update the [CapturedScope] object corresponding to
|
| /// this node if any variables are captured.
|
| - void attachCapturedScopeVariables(ir.Node node) {
|
| + void attachCapturedScopeVariables(ir.TreeNode node) {
|
| Set<ir.VariableDeclaration> capturedVariablesForScope =
|
| new Set<ir.VariableDeclaration>();
|
|
|
| @@ -84,15 +82,18 @@ class CapturedScopeBuilder extends ir.Visitor {
|
| }
|
| if (!capturedVariablesForScope.isEmpty) {
|
| assert(_model.scopeInfo != null);
|
| - assert(_currentLocalFunction != null);
|
| KernelScopeInfo from = _model.scopeInfo;
|
| - _scopesCapturedInClosureMap[node] = new KernelCapturedScope(
|
| + var capturedScope = new KernelCapturedScope(
|
| capturedVariablesForScope,
|
| new NodeBox(getBoxName(), _executableContext),
|
| - _currentLocalFunction,
|
| from.localsUsedInTryOrSync,
|
| from.freeVariables,
|
| _hasThisLocal);
|
| + _model.scopeInfo =
|
| + _scopesCapturedInClosureMap[node.parent] = capturedScope;
|
| + _currentScopeInfo.capturedScopes.add(node.parent);
|
| + print(
|
| + 'FUUUUUUUUUUUUUUUUUUU ${node.parent} ${_executableContext.parent} $_currentScopeInfo');
|
| }
|
| }
|
|
|
| @@ -154,6 +155,17 @@ class CapturedScopeBuilder extends ir.Visitor {
|
| node.visitChildren(this);
|
| }
|
|
|
| + @override
|
| + visitVariableDeclaration(ir.VariableDeclaration declaration) {
|
| + if (!declaration.isFieldFormal) {
|
| + _scopeVariables.add(declaration);
|
| + }
|
| +
|
| + if (declaration.initializer != null) {
|
| + declaration.initializer.accept(this);
|
| + }
|
| + }
|
| +
|
| /// Add this variable to the set of free variables if appropriate and add to
|
| /// the tally of variables used in try or sync blocks.
|
| void _markVariableAsUsed(ir.VariableDeclaration variable) {
|
| @@ -213,7 +225,6 @@ class CapturedScopeBuilder extends ir.Visitor {
|
| scope.boxedVariables,
|
| scope.capturedVariablesAccessor,
|
| boxedLoopVariables,
|
| - scope.context,
|
| scope.localsUsedInTryOrSync,
|
| scope.freeVariables,
|
| scope.hasThisLocal);
|
| @@ -223,7 +234,6 @@ class CapturedScopeBuilder extends ir.Visitor {
|
| bool oldIsInsideClosure = _isInsideClosure;
|
| ir.TreeNode oldExecutableContext = _executableContext;
|
| KernelScopeInfo oldScopeInfo = _currentScopeInfo;
|
| - ir.TreeNode oldLocalFunction = _currentLocalFunction;
|
|
|
| // _outermostNode is only null the first time we enter the body of the
|
| // field, constructor, or method that is being analyzed.
|
| @@ -233,11 +243,11 @@ class CapturedScopeBuilder extends ir.Visitor {
|
| _currentScopeInfo = new KernelScopeInfo(_hasThisLocal);
|
| if (_isInsideClosure) {
|
| _closuresToGenerate[node] = _currentScopeInfo;
|
| - _currentLocalFunction = node.parent;
|
| + print("EEEEEEEEEEEEEEEeee $_currentScopeInfo");
|
| } else {
|
| _outermostNode = node;
|
| - _model.scopeInfo = _currentScopeInfo;
|
| }
|
| + _model.scopeInfo = _currentScopeInfo;
|
|
|
| enterNewScope(node, () {
|
| node.visitChildren(this);
|
| @@ -250,7 +260,6 @@ class CapturedScopeBuilder extends ir.Visitor {
|
| _isInsideClosure = oldIsInsideClosure;
|
| _currentScopeInfo = oldScopeInfo;
|
| _executableContext = oldExecutableContext;
|
| - _currentLocalFunction = oldLocalFunction;
|
|
|
| // Mark all free variables as captured and expect to encounter them in the
|
| // outer function.
|
|
|