OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../closure.dart'; | 7 import '../closure.dart'; |
8 import '../elements/entities.dart'; | 8 import '../elements/entities.dart'; |
9 import '../kernel/element_map.dart'; | 9 import '../kernel/element_map.dart'; |
10 import 'closure.dart'; | 10 import 'closure.dart'; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 } | 90 } |
91 if (!capturedVariablesForScope.isEmpty) { | 91 if (!capturedVariablesForScope.isEmpty) { |
92 assert(_scopeInfoMap[_currentMember] != null); | 92 assert(_scopeInfoMap[_currentMember] != null); |
93 assert(_currentLocalFunction != null); | 93 assert(_currentLocalFunction != null); |
94 KernelScopeInfo from = _scopeInfoMap[_currentMember]; | 94 KernelScopeInfo from = _scopeInfoMap[_currentMember]; |
95 _scopesCapturedInClosureMap[node] = new KernelCapturedScope( | 95 _scopesCapturedInClosureMap[node] = new KernelCapturedScope( |
96 capturedVariablesForScope, | 96 capturedVariablesForScope, |
97 _currentLocalFunction, | 97 _currentLocalFunction, |
98 from.localsUsedInTryOrSync, | 98 from.localsUsedInTryOrSync, |
99 from.freeVariables, | 99 from.freeVariables, |
100 from.localsMap, | |
101 _thisLocal); | 100 _thisLocal); |
102 } | 101 } |
103 } | 102 } |
104 | 103 |
105 /// Perform book-keeping with the current set of local variables that have | 104 /// Perform book-keeping with the current set of local variables that have |
106 /// been seen thus far before entering this new scope. | 105 /// been seen thus far before entering this new scope. |
107 void enterNewScope(ir.Node node, void visitNewScope()) { | 106 void enterNewScope(ir.Node node, void visitNewScope()) { |
108 List<ir.VariableDeclaration> oldScopeVariables = _scopeVariables; | 107 List<ir.VariableDeclaration> oldScopeVariables = _scopeVariables; |
109 _scopeVariables = <ir.VariableDeclaration>[]; | 108 _scopeVariables = <ir.VariableDeclaration>[]; |
110 visitNewScope(); | 109 visitNewScope(); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 } | 199 } |
201 }); | 200 }); |
202 KernelCapturedScope scope = _scopesCapturedInClosureMap[node]; | 201 KernelCapturedScope scope = _scopesCapturedInClosureMap[node]; |
203 if (scope == null) return; | 202 if (scope == null) return; |
204 _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope( | 203 _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope( |
205 scope.boxedVariables, | 204 scope.boxedVariables, |
206 boxedLoopVariables, | 205 boxedLoopVariables, |
207 scope.context, | 206 scope.context, |
208 scope.localsUsedInTryOrSync, | 207 scope.localsUsedInTryOrSync, |
209 scope.freeVariables, | 208 scope.freeVariables, |
210 _localsMap, | |
211 scope.thisLocal); | 209 scope.thisLocal); |
212 } | 210 } |
213 | 211 |
214 void visitInvokable(ir.TreeNode node) { | 212 void visitInvokable(ir.TreeNode node) { |
215 bool oldIsInsideClosure = _isInsideClosure; | 213 bool oldIsInsideClosure = _isInsideClosure; |
216 ir.Node oldExecutableContext = _executableContext; | 214 ir.Node oldExecutableContext = _executableContext; |
217 KernelScopeInfo oldScopeInfo = _currentScopeInfo; | 215 KernelScopeInfo oldScopeInfo = _currentScopeInfo; |
218 Local oldLocalFunction = _currentLocalFunction; | 216 Local oldLocalFunction = _currentLocalFunction; |
219 | 217 |
220 // _outermostNode is only null the first time we enter the body of the | 218 // _outermostNode is only null the first time we enter the body of the |
221 // field, constructor, or method that is being analyzed. | 219 // field, constructor, or method that is being analyzed. |
222 _isInsideClosure = _outermostNode != null; | 220 _isInsideClosure = _outermostNode != null; |
223 _executableContext = node; | 221 _executableContext = node; |
224 | 222 |
225 _currentScopeInfo = new KernelScopeInfo(_thisLocal, _localsMap); | 223 _currentScopeInfo = new KernelScopeInfo(_thisLocal); |
226 if (_isInsideClosure) { | 224 if (_isInsideClosure) { |
227 _closuresToGenerate[node] = _currentScopeInfo; | 225 _closuresToGenerate[node] = _currentScopeInfo; |
228 _currentLocalFunction = _localsMap.getLocalFunction(node.parent); | 226 _currentLocalFunction = _localsMap.getLocalFunction(node.parent); |
229 } else { | 227 } else { |
230 _outermostNode = node; | 228 _outermostNode = node; |
231 _scopeInfoMap[_currentMember] = _currentScopeInfo; | 229 _scopeInfoMap[_currentMember] = _currentScopeInfo; |
232 } | 230 } |
233 | 231 |
234 enterNewScope(node, () { | 232 enterNewScope(node, () { |
235 node.visitChildren(this); | 233 node.visitChildren(this); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 } | 269 } |
272 | 270 |
273 void translateConstructorOrProcedure(ir.Node constructorOrProcedure) { | 271 void translateConstructorOrProcedure(ir.Node constructorOrProcedure) { |
274 constructorOrProcedure.accept(this); | 272 constructorOrProcedure.accept(this); |
275 } | 273 } |
276 | 274 |
277 void visitFunctionNode(ir.FunctionNode functionNode) { | 275 void visitFunctionNode(ir.FunctionNode functionNode) { |
278 visitInvokable(functionNode); | 276 visitInvokable(functionNode); |
279 } | 277 } |
280 } | 278 } |
OLD | NEW |