Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: pkg/compiler/lib/src/js_model/locals.dart

Issue 2995113002: Share locals between members (Closed)
Patch Set: Rebased Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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' show JClosureClass;
10 import '../closure.dart'; 9 import '../closure.dart';
11 import '../common.dart'; 10 import '../common.dart';
12 import '../elements/entities.dart'; 11 import '../elements/entities.dart';
13 import '../elements/jumps.dart'; 12 import '../elements/jumps.dart';
14 import '../kernel/element_map.dart'; 13 import '../kernel/element_map.dart';
15 14
16 class GlobalLocalsMap { 15 class GlobalLocalsMap {
17 Map<MemberEntity, KernelToLocalsMap> _localsMaps = 16 Map<MemberEntity, KernelToLocalsMap> _localsMaps =
18 <MemberEntity, KernelToLocalsMap>{}; 17 <MemberEntity, KernelToLocalsMap>{};
19 18
19 /// Returns the [KernelToLocalsMap] for [member].
20 KernelToLocalsMap getLocalsMap(MemberEntity member) { 20 KernelToLocalsMap getLocalsMap(MemberEntity member) {
21 return _localsMaps.putIfAbsent( 21 return _localsMaps.putIfAbsent(
22 member, () => new KernelToLocalsMapImpl(member)); 22 member, () => new KernelToLocalsMapImpl(member));
23 } 23 }
24
25 /// Associates [localsMap] with [member].
26 ///
27 /// Use this for sharing maps between members that share IR nodes.
28 void setLocalsMap(MemberEntity member, KernelToLocalsMap localsMap) {
29 assert(!_localsMaps.containsKey(member),
30 "Locals map already created for $member.");
31 _localsMaps[member] = localsMap;
32 }
24 } 33 }
25 34
26 class KernelToLocalsMapImpl implements KernelToLocalsMap { 35 class KernelToLocalsMapImpl implements KernelToLocalsMap {
27 final List<MemberEntity> _members = <MemberEntity>[]; 36 final List<MemberEntity> _members = <MemberEntity>[];
28 Map<ir.TreeNode, JLocal> _map = <ir.TreeNode, JLocal>{}; 37 Map<ir.TreeNode, JLocal> _map = <ir.TreeNode, JLocal>{};
29 Map<ir.TreeNode, JJumpTarget> _jumpTargetMap; 38 Map<ir.TreeNode, JJumpTarget> _jumpTargetMap;
30 Set<ir.BreakStatement> _breaksAsContinue; 39 Set<ir.BreakStatement> _breaksAsContinue;
31 40
32 MemberEntity get currentMember => _members.last; 41 MemberEntity get currentMember => _members.last;
33 42
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 return _jumpTargetMap[node]; 128 return _jumpTargetMap[node];
120 } 129 }
121 130
122 @override 131 @override
123 JumpTarget getJumpTargetForWhile(ir.WhileStatement node) { 132 JumpTarget getJumpTargetForWhile(ir.WhileStatement node) {
124 _ensureJumpMap(node); 133 _ensureJumpMap(node);
125 return _jumpTargetMap[node]; 134 return _jumpTargetMap[node];
126 } 135 }
127 136
128 @override 137 @override
129 Local getLocalVariable(ir.VariableDeclaration node, 138 Local getLocalVariable(ir.VariableDeclaration node) {
130 {bool isClosureCallMethod = false}) {
131 if (isClosureCallMethod && !_map.containsKey(node)) {
132 // Node might correspond to a free variable in the closure class.
133 assert(currentMember.enclosingClass is JClosureClass);
134 return (currentMember.enclosingClass as JClosureClass)
135 .localsMap
136 .getLocalVariable(node);
137 }
138 return _map.putIfAbsent(node, () { 139 return _map.putIfAbsent(node, () {
139 return new JLocal( 140 return new JLocal(
140 node.name, currentMember, node.parent is ir.FunctionNode); 141 node.name, currentMember, node.parent is ir.FunctionNode);
141 }); 142 });
142 } 143 }
143 144
144 @override 145 @override
145 // TODO(johnniwinther): Split this out into two methods -- one for 146 // TODO(johnniwinther): Split this out into two methods -- one for
146 // FunctionDeclaration and one for FunctionExpression, since basically the 147 // FunctionDeclaration and one for FunctionExpression, since basically the
147 // whole thing is different depending on the node type. The reason it's not 148 // whole thing is different depending on the node type. The reason it's not
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 sb.write(memberContext.enclosingClass.name); 365 sb.write(memberContext.enclosingClass.name);
365 sb.write('.'); 366 sb.write('.');
366 } 367 }
367 sb.write(memberContext.name); 368 sb.write(memberContext.name);
368 sb.write('#'); 369 sb.write('#');
369 sb.write(name); 370 sb.write(name);
370 sb.write(')'); 371 sb.write(')');
371 return sb.toString(); 372 return sb.toString();
372 } 373 }
373 } 374 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_model/closure.dart ('k') | pkg/compiler/lib/src/kernel/element_map.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698