| 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 library dart2js.js_model.locals; | 5 library dart2js.js_model.locals; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
| 8 | 8 |
| 9 import '../closure.dart'; | 9 import '../closure.dart'; |
| 10 import '../common.dart'; | 10 import '../common.dart'; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 "Locals map already created for $member."); | 30 "Locals map already created for $member."); |
| 31 _localsMaps[member] = localsMap; | 31 _localsMaps[member] = localsMap; |
| 32 } | 32 } |
| 33 } | 33 } |
| 34 | 34 |
| 35 class KernelToLocalsMapImpl implements KernelToLocalsMap { | 35 class KernelToLocalsMapImpl implements KernelToLocalsMap { |
| 36 final List<MemberEntity> _members = <MemberEntity>[]; | 36 final List<MemberEntity> _members = <MemberEntity>[]; |
| 37 Map<ir.VariableDeclaration, JLocal> _map = <ir.VariableDeclaration, JLocal>{}; | 37 Map<ir.VariableDeclaration, JLocal> _map = <ir.VariableDeclaration, JLocal>{}; |
| 38 Map<ir.TreeNode, JJumpTarget> _jumpTargetMap; | 38 Map<ir.TreeNode, JJumpTarget> _jumpTargetMap; |
| 39 Set<ir.BreakStatement> _breaksAsContinue; | 39 Set<ir.BreakStatement> _breaksAsContinue; |
| 40 List<ir.VariableDeclaration> _parameterList = <ir.VariableDeclaration>[]; |
| 40 | 41 |
| 41 MemberEntity get currentMember => _members.last; | 42 MemberEntity get currentMember => _members.last; |
| 42 | 43 |
| 43 // TODO(johnniwinther): Compute this eagerly from the root of the member. | 44 // TODO(johnniwinther): Compute this eagerly from the root of the member. |
| 44 void _ensureJumpMap(ir.TreeNode node) { | 45 void _ensureJumpMap(ir.TreeNode node) { |
| 45 if (_jumpTargetMap == null) { | 46 if (_jumpTargetMap == null) { |
| 46 JumpVisitor visitor = new JumpVisitor(currentMember); | 47 JumpVisitor visitor = new JumpVisitor(currentMember); |
| 47 | 48 |
| 48 // Find the root node for the current member. | 49 // Find the root node for the current member. |
| 49 while (node is! ir.Member) { | 50 while (node is! ir.Member) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 | 131 |
| 131 @override | 132 @override |
| 132 JumpTarget getJumpTargetForWhile(ir.WhileStatement node) { | 133 JumpTarget getJumpTargetForWhile(ir.WhileStatement node) { |
| 133 _ensureJumpMap(node); | 134 _ensureJumpMap(node); |
| 134 return _jumpTargetMap[node]; | 135 return _jumpTargetMap[node]; |
| 135 } | 136 } |
| 136 | 137 |
| 137 @override | 138 @override |
| 138 Local getLocalVariable(ir.VariableDeclaration node) { | 139 Local getLocalVariable(ir.VariableDeclaration node) { |
| 139 return _map.putIfAbsent(node, () { | 140 return _map.putIfAbsent(node, () { |
| 140 return new JLocal( | 141 Local local; |
| 141 node.name, currentMember, node.parent is ir.FunctionNode); | 142 if (node.parent is ir.FunctionNode) { |
| 143 local = new JParameter(_parameterList.length, node.name, currentMember); |
| 144 _parameterList.add(node); |
| 145 } else { |
| 146 local = new JLocal(node.name, currentMember); |
| 147 } |
| 148 return local; |
| 142 }); | 149 }); |
| 143 } | 150 } |
| 144 | 151 |
| 145 @override | 152 @override |
| 153 ir.FunctionNode getFunctionNodeForParameter(covariant JParameter parameter) { |
| 154 return _parameterList[parameter.parameterIndex].parent; |
| 155 } |
| 156 |
| 157 ir.DartType getParameterType(covariant JParameter parameter) { |
| 158 return _parameterList[parameter.parameterIndex].type; |
| 159 } |
| 160 |
| 161 @override |
| 146 CapturedLoopScope getCapturedLoopScope( | 162 CapturedLoopScope getCapturedLoopScope( |
| 147 ClosureDataLookup closureLookup, ir.TreeNode node) { | 163 ClosureDataLookup closureLookup, ir.TreeNode node) { |
| 148 return closureLookup.getCapturedLoopScope(node); | 164 return closureLookup.getCapturedLoopScope(node); |
| 149 } | 165 } |
| 150 | 166 |
| 151 @override | 167 @override |
| 152 ClosureRepresentationInfo getClosureRepresentationInfo( | 168 ClosureRepresentationInfo getClosureRepresentationInfo( |
| 153 ClosureDataLookup closureLookup, ir.TreeNode node) { | 169 ClosureDataLookup closureLookup, ir.TreeNode node) { |
| 154 return closureLookup.getClosureInfo(node); | 170 return closureLookup.getClosureInfo(node); |
| 155 } | 171 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 sb.write(isContinueTarget); | 356 sb.write(isContinueTarget); |
| 341 sb.write(')'); | 357 sb.write(')'); |
| 342 return sb.toString(); | 358 return sb.toString(); |
| 343 } | 359 } |
| 344 } | 360 } |
| 345 | 361 |
| 346 class JLocal implements Local { | 362 class JLocal implements Local { |
| 347 final String name; | 363 final String name; |
| 348 final MemberEntity memberContext; | 364 final MemberEntity memberContext; |
| 349 | 365 |
| 366 JLocal(this.name, this.memberContext); |
| 367 |
| 350 /// True if this local represents a local parameter. | 368 /// True if this local represents a local parameter. |
| 351 final bool isRegularParameter; | 369 bool get isRegularParameter => false; |
| 352 | |
| 353 JLocal(this.name, this.memberContext, [isParameter = false]) | |
| 354 : isRegularParameter = isParameter; | |
| 355 | 370 |
| 356 @override | 371 @override |
| 357 Entity get executableContext => memberContext; | 372 Entity get executableContext => memberContext; |
| 358 | 373 |
| 374 String get _kind => 'local'; |
| 375 |
| 359 String toString() { | 376 String toString() { |
| 360 StringBuffer sb = new StringBuffer(); | 377 StringBuffer sb = new StringBuffer(); |
| 361 sb.write('local('); | 378 sb.write('$_kind('); |
| 362 if (memberContext.enclosingClass != null) { | 379 if (memberContext.enclosingClass != null) { |
| 363 sb.write(memberContext.enclosingClass.name); | 380 sb.write(memberContext.enclosingClass.name); |
| 364 sb.write('.'); | 381 sb.write('.'); |
| 365 } | 382 } |
| 366 sb.write(memberContext.name); | 383 sb.write(memberContext.name); |
| 367 sb.write('#'); | 384 sb.write('#'); |
| 368 sb.write(name); | 385 sb.write(name); |
| 369 sb.write(')'); | 386 sb.write(')'); |
| 370 return sb.toString(); | 387 return sb.toString(); |
| 371 } | 388 } |
| 372 } | 389 } |
| 390 |
| 391 class JParameter extends JLocal { |
| 392 final int parameterIndex; |
| 393 |
| 394 JParameter(this.parameterIndex, String name, MemberEntity memberContext) |
| 395 : super(name, memberContext); |
| 396 |
| 397 bool get isRegularParameter => true; |
| 398 |
| 399 String get _kind => 'parameter'; |
| 400 } |
| OLD | NEW |