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'; |
11 import '../elements/entities.dart'; | 11 import '../elements/entities.dart'; |
12 import '../elements/jumps.dart'; | 12 import '../elements/jumps.dart'; |
13 import '../kernel/element_map.dart'; | 13 import '../kernel/element_map.dart'; |
14 | 14 |
15 class GlobalLocalsMap { | 15 class GlobalLocalsMap { |
16 Map<MemberEntity, KernelToLocalsMap> _localsMaps = | 16 Map<MemberEntity, KernelToLocalsMap> _localsMaps = |
17 <MemberEntity, KernelToLocalsMap>{}; | 17 <MemberEntity, KernelToLocalsMap>{}; |
18 | 18 |
19 KernelToLocalsMap getLocalsMap(MemberEntity member) { | 19 KernelToLocalsMap getLocalsMap(MemberEntity member) { |
20 return _localsMaps.putIfAbsent( | 20 return _localsMaps.putIfAbsent( |
21 member, () => new KernelToLocalsMapImpl(member)); | 21 member, () => new KernelToLocalsMapImpl(member)); |
22 } | 22 } |
23 } | 23 } |
24 | 24 |
25 class KernelToLocalsMapImpl implements KernelToLocalsMap { | 25 class KernelToLocalsMapImpl implements KernelToLocalsMap { |
26 final List<MemberEntity> _members = <MemberEntity>[]; | 26 final List<MemberEntity> _members = <MemberEntity>[]; |
27 Map<ir.VariableDeclaration, JLocal> _map = <ir.VariableDeclaration, JLocal>{}; | 27 Map<ir.TreeNode, JLocal> _map = <ir.TreeNode, JLocal>{}; |
28 Map<ir.TreeNode, JJumpTarget> _jumpTargetMap; | 28 Map<ir.TreeNode, JJumpTarget> _jumpTargetMap; |
29 Set<ir.BreakStatement> _breaksAsContinue; | 29 Set<ir.BreakStatement> _breaksAsContinue; |
30 | 30 |
31 MemberEntity get currentMember => _members.last; | 31 MemberEntity get currentMember => _members.last; |
32 | 32 |
33 // TODO(johnniwinther): Compute this eagerly from the root of the member. | 33 // TODO(johnniwinther): Compute this eagerly from the root of the member. |
34 void _ensureJumpMap(ir.TreeNode node) { | 34 void _ensureJumpMap(ir.TreeNode node) { |
35 if (_jumpTargetMap == null) { | 35 if (_jumpTargetMap == null) { |
36 JumpVisitor visitor = new JumpVisitor(currentMember); | 36 JumpVisitor visitor = new JumpVisitor(currentMember); |
37 | 37 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 return _jumpTargetMap[node]; | 118 return _jumpTargetMap[node]; |
119 } | 119 } |
120 | 120 |
121 @override | 121 @override |
122 JumpTarget getJumpTargetForWhile(ir.WhileStatement node) { | 122 JumpTarget getJumpTargetForWhile(ir.WhileStatement node) { |
123 _ensureJumpMap(node); | 123 _ensureJumpMap(node); |
124 return _jumpTargetMap[node]; | 124 return _jumpTargetMap[node]; |
125 } | 125 } |
126 | 126 |
127 @override | 127 @override |
128 Local getLocal(ir.VariableDeclaration node) { | 128 Local getLocalVariable(ir.VariableDeclaration node) { |
129 return _map.putIfAbsent(node, () { | 129 return _map.putIfAbsent(node, () { |
130 return new JLocal(node.name, currentMember); | 130 return new JLocal(node.name, currentMember); |
131 }); | 131 }); |
132 } | 132 } |
133 | 133 |
134 @override | 134 @override |
| 135 Local getLocalFunction(ir.TreeNode node) { |
| 136 assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression, |
| 137 failedAt(currentMember, 'Invalid local function node: $node')); |
| 138 return _map.putIfAbsent(node, () { |
| 139 String name; |
| 140 if (node is ir.FunctionDeclaration) { |
| 141 name = node.variable.name; |
| 142 } else if (node is ir.FunctionExpression) { |
| 143 name = ''; |
| 144 } |
| 145 return new JLocal(name, currentMember); |
| 146 }); |
| 147 } |
| 148 |
| 149 @override |
135 CapturedLoopScope getCapturedLoopScope( | 150 CapturedLoopScope getCapturedLoopScope( |
136 ClosureDataLookup closureLookup, ir.TreeNode node) { | 151 ClosureDataLookup closureLookup, ir.TreeNode node) { |
137 return closureLookup.getCapturedLoopScope(node); | 152 return closureLookup.getCapturedLoopScope(node); |
138 } | 153 } |
139 } | 154 } |
140 | 155 |
141 class JumpVisitor extends ir.Visitor { | 156 class JumpVisitor extends ir.Visitor { |
142 int index = 0; | 157 int index = 0; |
143 final MemberEntity member; | 158 final MemberEntity member; |
144 final Map<ir.TreeNode, JJumpTarget> jumpTargetMap = | 159 final Map<ir.TreeNode, JJumpTarget> jumpTargetMap = |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 sb.write(memberContext.enclosingClass.name); | 285 sb.write(memberContext.enclosingClass.name); |
271 sb.write('.'); | 286 sb.write('.'); |
272 } | 287 } |
273 sb.write(memberContext.name); | 288 sb.write(memberContext.name); |
274 sb.write('#'); | 289 sb.write('#'); |
275 sb.write(name); | 290 sb.write(name); |
276 sb.write(')'); | 291 sb.write(')'); |
277 return sb.toString(); | 292 return sb.toString(); |
278 } | 293 } |
279 } | 294 } |
OLD | NEW |