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