OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 '../common/tasks.dart'; | 8 import '../common/tasks.dart'; |
9 import '../elements/entities.dart'; | 9 import '../elements/entities.dart'; |
10 import '../world.dart'; | 10 import '../world.dart'; |
(...skipping 26 matching lines...) Expand all Loading... |
37 visitTryFinally(ir.TryFinally node) { | 37 visitTryFinally(ir.TryFinally node) { |
38 bool oldInTry = _inTry; | 38 bool oldInTry = _inTry; |
39 _inTry = true; | 39 _inTry = true; |
40 node.visitChildren(this); | 40 node.visitChildren(this); |
41 _inTry = oldInTry; | 41 _inTry = oldInTry; |
42 } | 42 } |
43 | 43 |
44 @override | 44 @override |
45 visitVariableGet(ir.VariableGet node) { | 45 visitVariableGet(ir.VariableGet node) { |
46 if (_inTry) { | 46 if (_inTry) { |
47 info.registerUsedInTryOrSync(_localsMap.getLocal(node.variable)); | 47 info.variablesUsedInTryOrSync.add(_localsMap.getLocal(node.variable)); |
48 } | 48 } |
49 } | 49 } |
50 | 50 |
51 @override | 51 @override |
52 visitVariableSet(ir.VariableSet node) { | 52 visitVariableSet(ir.VariableSet node) { |
53 if (_inTry) { | 53 if (_inTry) { |
54 info.registerUsedInTryOrSync(_localsMap.getLocal(node.variable)); | 54 info.variablesUsedInTryOrSync.add(_localsMap.getLocal(node.variable)); |
55 } | 55 } |
56 node.visitChildren(this); | 56 node.visitChildren(this); |
57 } | 57 } |
58 } | 58 } |
59 | 59 |
60 /// Closure conversion code using our new Entity model. Closure conversion is | 60 /// Closure conversion code using our new Entity model. Closure conversion is |
61 /// necessary because the semantics of closures are slightly different in Dart | 61 /// necessary because the semantics of closures are slightly different in Dart |
62 /// than JavaScript. Closure conversion is separated out into two phases: | 62 /// than JavaScript. Closure conversion is separated out into two phases: |
63 /// generation of a new (temporary) representation to store where variables need | 63 /// generation of a new (temporary) representation to store where variables need |
64 /// to be hoisted/captured up at another level to re-write the closure, and then | 64 /// to be hoisted/captured up at another level to re-write the closure, and then |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } | 98 } |
99 | 99 |
100 /// TODO(johnniwinther,efortuna): Implement this. | 100 /// TODO(johnniwinther,efortuna): Implement this. |
101 @override | 101 @override |
102 LoopClosureRepresentationInfo getClosureRepresentationInfoForLoop( | 102 LoopClosureRepresentationInfo getClosureRepresentationInfoForLoop( |
103 ir.Node loopNode) { | 103 ir.Node loopNode) { |
104 return const LoopClosureRepresentationInfo(); | 104 return const LoopClosureRepresentationInfo(); |
105 } | 105 } |
106 | 106 |
107 @override | 107 @override |
| 108 ScopeInfo getScopeInfo(Entity entity) { |
| 109 // TODO(efortuna): Specialize this function from the one below. |
| 110 return getClosureRepresentationInfo(entity); |
| 111 } |
| 112 |
| 113 @override |
108 ClosureRepresentationInfo getClosureRepresentationInfo(Entity entity) { | 114 ClosureRepresentationInfo getClosureRepresentationInfo(Entity entity) { |
109 return _infoMap.putIfAbsent(entity, () { | 115 return _infoMap.putIfAbsent(entity, () { |
110 if (entity is MemberEntity) { | 116 if (entity is MemberEntity) { |
111 ir.Member node = _elementMap.getMemberNode(entity); | 117 ir.Member node = _elementMap.getMemberNode(entity); |
112 ThisLocal thisLocal; | 118 ThisLocal thisLocal; |
113 if (entity.isInstanceMember) { | 119 if (entity.isInstanceMember) { |
114 thisLocal = new ThisLocal(entity); | 120 thisLocal = new ThisLocal(entity); |
115 } | 121 } |
116 KernelClosureDataBuilder builder = new KernelClosureDataBuilder( | 122 KernelClosureDataBuilder builder = new KernelClosureDataBuilder( |
117 _globalLocalsMap.getLocalsMap(entity), thisLocal); | 123 _globalLocalsMap.getLocalsMap(entity), thisLocal); |
118 node.accept(builder); | 124 node.accept(builder); |
119 return builder.info; | 125 return builder.info; |
120 } | 126 } |
121 | 127 |
122 /// TODO(johnniwinther,efortuna): Implement this. | 128 /// TODO(johnniwinther,efortuna): Implement this. |
123 return const ClosureRepresentationInfo(); | 129 return const ClosureRepresentationInfo(); |
124 }); | 130 }); |
125 } | 131 } |
126 } | 132 } |
127 | 133 |
128 // TODO(johnniwinther): Add unittest for the computed | 134 // TODO(johnniwinther): Add unittest for the computed |
129 // [ClosureRepresentationInfo]. | 135 // [ClosureRepresentationInfo]. |
130 class KernelClosureRepresentationInfo extends ClosureRepresentationInfo { | 136 class KernelClosureRepresentationInfo extends ClosureRepresentationInfo { |
131 final ThisLocal thisLocal; | 137 final ThisLocal thisLocal; |
132 final Set<Local> _localsUsedInTryOrSync = new Set<Local>(); | 138 final Set<Local> variablesUsedInTryOrSync = new Set<Local>(); |
133 | 139 |
134 KernelClosureRepresentationInfo(this.thisLocal); | 140 KernelClosureRepresentationInfo(this.thisLocal); |
135 | 141 |
136 void registerUsedInTryOrSync(Local local) { | |
137 _localsUsedInTryOrSync.add(local); | |
138 } | |
139 | |
140 bool variableIsUsedInTryOrSync(Local variable) => | |
141 _localsUsedInTryOrSync.contains(variable); | |
142 | |
143 String toString() { | 142 String toString() { |
144 StringBuffer sb = new StringBuffer(); | 143 StringBuffer sb = new StringBuffer(); |
145 sb.write('this=$thisLocal,'); | 144 sb.write('this=$thisLocal,'); |
146 sb.write('localsUsedInTryOrSync={${_localsUsedInTryOrSync.join(', ')}}'); | 145 sb.write( |
| 146 'variablesUsedInTryOrSync={${variablesUsedInTryOrSync.join(', ')}}'); |
147 return sb.toString(); | 147 return sb.toString(); |
148 } | 148 } |
149 } | 149 } |
OLD | NEW |