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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 if (node is ir.Procedure) { | 96 if (node is ir.Procedure) { |
97 thisLocal = new ThisLocal(_kernelToElementMap.getMethod(node)); | 97 thisLocal = new ThisLocal(_kernelToElementMap.getMethod(node)); |
98 } else if (node is ir.Field) { | 98 } else if (node is ir.Field) { |
99 thisLocal = new ThisLocal(_kernelToElementMap.getField(node)); | 99 thisLocal = new ThisLocal(_kernelToElementMap.getField(node)); |
100 } | 100 } |
101 } else if (node is ir.Constructor) { | 101 } else if (node is ir.Constructor) { |
102 thisLocal = new ThisLocal(_kernelToElementMap.getConstructor(node)); | 102 thisLocal = new ThisLocal(_kernelToElementMap.getConstructor(node)); |
103 } | 103 } |
104 | 104 |
105 assert(_scopeInfoMap[_nodeToEntity(node)] != null); | 105 assert(_scopeInfoMap[_nodeToEntity(node)] != null); |
| 106 KernelScopeInfo from = _scopeInfoMap[_nodeToEntity(node)]; |
106 _scopesCapturedInClosureMap[node] = new KernelCapturedScope( | 107 _scopesCapturedInClosureMap[node] = new KernelCapturedScope( |
107 capturedVariablesForScope, | 108 capturedVariablesForScope, |
108 _nodeToEntity(_executableContext), | 109 _nodeToEntity(_executableContext), |
| 110 from.localsUsedInTryOrSync, |
| 111 from.freeVariables, |
| 112 from.localsMap, |
109 thisLocal); | 113 thisLocal); |
110 } | 114 } |
111 } | 115 } |
112 | 116 |
113 Entity _nodeToEntity(ir.Node node) { | 117 Entity _nodeToEntity(ir.Node node) { |
114 if (node is ir.Member) { | 118 if (node is ir.Member) { |
115 return _kernelToElementMap.getMember(node); | 119 return _kernelToElementMap.getMember(node); |
116 } else { | 120 } else { |
117 return _kernelToElementMap.getLocalFunction(node); | 121 return _kernelToElementMap.getLocalFunction(node); |
118 } | 122 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 boxedLoopVariables.add(_localsMap.getLocal(variable)); | 218 boxedLoopVariables.add(_localsMap.getLocal(variable)); |
215 } | 219 } |
216 } | 220 } |
217 }); | 221 }); |
218 KernelCapturedScope scope = _scopesCapturedInClosureMap[node]; | 222 KernelCapturedScope scope = _scopesCapturedInClosureMap[node]; |
219 if (scope == null) return; | 223 if (scope == null) return; |
220 _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope( | 224 _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope( |
221 scope.boxedVariables, | 225 scope.boxedVariables, |
222 boxedLoopVariables, | 226 boxedLoopVariables, |
223 scope.context, | 227 scope.context, |
| 228 scope.localsUsedInTryOrSync, |
| 229 scope.freeVariables, |
| 230 _localsMap, |
224 scope.thisLocal); | 231 scope.thisLocal); |
225 } | 232 } |
226 | 233 |
227 void visitInvokable(ir.TreeNode node) { | 234 void visitInvokable(ir.TreeNode node) { |
228 bool oldIsInsideClosure = _isInsideClosure; | 235 bool oldIsInsideClosure = _isInsideClosure; |
229 ir.Node oldExecutableContext = _executableContext; | 236 ir.Node oldExecutableContext = _executableContext; |
230 KernelScopeInfo oldScopeInfo = _currentScopeInfo; | 237 KernelScopeInfo oldScopeInfo = _currentScopeInfo; |
231 | 238 |
232 // _outermostNode is only null the first time we enter the body of the | 239 // _outermostNode is only null the first time we enter the body of the |
233 // field, constructor, or method that is being analyzed. | 240 // field, constructor, or method that is being analyzed. |
234 _isInsideClosure = _outermostNode != null; | 241 _isInsideClosure = _outermostNode != null; |
235 _executableContext = node; | 242 _executableContext = node; |
236 _currentScopeInfo = new KernelScopeInfo(_nodeToThisLocal(node)); | 243 _currentScopeInfo = new KernelScopeInfo(_nodeToThisLocal(node), _localsMap); |
237 if (_isInsideClosure) { | 244 if (_isInsideClosure) { |
238 _closuresToGenerate[node] = _currentScopeInfo; | 245 _closuresToGenerate[node] = _currentScopeInfo; |
239 } else { | 246 } else { |
240 _outermostNode = node; | 247 _outermostNode = node; |
241 _scopeInfoMap[_originalEntity] = _currentScopeInfo; | 248 _scopeInfoMap[_originalEntity] = _currentScopeInfo; |
242 } | 249 } |
243 | 250 |
244 enterNewScope(node, () { | 251 enterNewScope(node, () { |
245 node.visitChildren(this); | 252 node.visitChildren(this); |
246 }); | 253 }); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 nodeToConvert.isInstanceMember)) { | 315 nodeToConvert.isInstanceMember)) { |
309 return new ThisLocal(_kernelToElementMap.getConstructor(nodeToConvert)); | 316 return new ThisLocal(_kernelToElementMap.getConstructor(nodeToConvert)); |
310 } else if (nodeToConvert is ir.Procedure && | 317 } else if (nodeToConvert is ir.Procedure && |
311 nodeToConvert.isInstanceMember) { | 318 nodeToConvert.isInstanceMember) { |
312 return new ThisLocal(_kernelToElementMap.getMethod(nodeToConvert)); | 319 return new ThisLocal(_kernelToElementMap.getMethod(nodeToConvert)); |
313 } | 320 } |
314 } | 321 } |
315 return null; | 322 return null; |
316 } | 323 } |
317 } | 324 } |
OLD | NEW |