| 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 |