OLD | NEW |
1 library dart2js.unsugar_cps; | 1 library dart2js.unsugar_cps; |
2 | 2 |
3 import '../../cps_ir/cps_ir_nodes.dart'; | 3 import '../../cps_ir/cps_ir_nodes.dart'; |
4 | 4 |
5 import '../../cps_ir/optimizers.dart' show ParentVisitor; | 5 import '../../cps_ir/optimizers.dart' show ParentVisitor; |
6 import '../../constants/values.dart'; | 6 import '../../constants/values.dart'; |
7 import '../../elements/elements.dart'; | 7 import '../../elements/elements.dart'; |
8 import '../../io/source_information.dart'; | 8 import '../../io/source_information.dart'; |
9 import '../../js_backend/codegen/glue.dart'; | 9 import '../../js_backend/codegen/glue.dart'; |
10 import '../../dart2jslib.dart' show Selector, World; | 10 import '../../dart2jslib.dart' show Selector, World; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 // Set all parent pointers. | 75 // Set all parent pointers. |
76 _parentVisitor.visit(function); | 76 _parentVisitor.visit(function); |
77 | 77 |
78 if (inInterceptedMethod) { | 78 if (inInterceptedMethod) { |
79 explicitReceiverParameter.substituteFor(thisParameter); | 79 explicitReceiverParameter.substituteFor(thisParameter); |
80 } | 80 } |
81 | 81 |
82 visit(function); | 82 visit(function); |
83 } | 83 } |
84 | 84 |
85 @override | |
86 visit(Node node) { | |
87 Node result = node.accept(this); | |
88 return result != null ? result : node; | |
89 } | |
90 | |
91 Constant get trueConstant { | 85 Constant get trueConstant { |
92 return new Constant(new TrueConstantValue()); | 86 return new Constant(new TrueConstantValue()); |
93 } | 87 } |
94 | 88 |
95 Constant get falseConstant { | 89 Constant get falseConstant { |
96 return new Constant(new FalseConstantValue()); | 90 return new Constant(new FalseConstantValue()); |
97 } | 91 } |
98 | 92 |
99 Constant get nullConstant { | 93 Constant get nullConstant { |
100 return new Constant(new NullConstantValue()); | 94 return new Constant(new NullConstantValue()); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 function, selector, arguments, continuation, null); | 164 function, selector, arguments, continuation, null); |
171 _parentVisitor.processInvokeStatic(invoke); | 165 _parentVisitor.processInvokeStatic(invoke); |
172 | 166 |
173 LetCont letCont = new LetCont(continuation, invoke); | 167 LetCont letCont = new LetCont(continuation, invoke); |
174 _parentVisitor.processLetCont(letCont); | 168 _parentVisitor.processLetCont(letCont); |
175 | 169 |
176 parent.body = letCont; | 170 parent.body = letCont; |
177 letCont.parent = parent; | 171 letCont.parent = parent; |
178 } | 172 } |
179 | 173 |
180 processLetHandler(LetHandler node) { | 174 @override |
| 175 Expression traverseLetHandler(LetHandler node) { |
| 176 assert(node.handler.parameters.length == 2); |
| 177 Parameter previousExceptionParameter = _exceptionParameter; |
| 178 |
181 // BEFORE: Handlers have two parameters, exception and stack trace. | 179 // BEFORE: Handlers have two parameters, exception and stack trace. |
182 // AFTER: Handlers have a single parameter, which is unwrapped to get | 180 // AFTER: Handlers have a single parameter, which is unwrapped to get |
183 // the exception and stack trace. | 181 // the exception and stack trace. |
184 _exceptionParameter = node.handler.parameters.first; | 182 _exceptionParameter = node.handler.parameters.first; |
185 Parameter stackTraceParameter = node.handler.parameters.last; | 183 Parameter stackTraceParameter = node.handler.parameters.last; |
186 Expression body = node.handler.body; | 184 Expression body = node.handler.body; |
187 if (_exceptionParameter.hasAtLeastOneUse || | 185 if (_exceptionParameter.hasAtLeastOneUse || |
188 stackTraceParameter.hasAtLeastOneUse) { | 186 stackTraceParameter.hasAtLeastOneUse) { |
189 Parameter exceptionValue = new Parameter(null); | 187 Parameter exceptionValue = new Parameter(null); |
190 exceptionValue.substituteFor(_exceptionParameter); | 188 exceptionValue.substituteFor(_exceptionParameter); |
191 insertStaticCall(_glue.getExceptionUnwrapper(), [_exceptionParameter], | 189 insertStaticCall(_glue.getExceptionUnwrapper(), [_exceptionParameter], |
192 exceptionValue, body); | 190 exceptionValue, body); |
193 | 191 |
194 if (stackTraceParameter.hasAtLeastOneUse) { | 192 if (stackTraceParameter.hasAtLeastOneUse) { |
195 Parameter stackTraceValue = new Parameter(null); | 193 Parameter stackTraceValue = new Parameter(null); |
196 stackTraceValue.substituteFor(stackTraceParameter); | 194 stackTraceValue.substituteFor(stackTraceParameter); |
197 insertStaticCall(_glue.getTraceFromException(), [_exceptionParameter], | 195 insertStaticCall(_glue.getTraceFromException(), [_exceptionParameter], |
198 stackTraceValue, body); | 196 stackTraceValue, body); |
199 } | 197 } |
200 } | 198 } |
201 | 199 |
202 assert(stackTraceParameter.hasNoUses); | 200 assert(stackTraceParameter.hasNoUses); |
203 node.handler.parameters.removeLast(); | 201 node.handler.parameters.removeLast(); |
204 } | |
205 | 202 |
206 @override | |
207 visitLetHandler(LetHandler node) { | |
208 assert(node.handler.parameters.length == 2); | |
209 Parameter previousExceptionParameter = _exceptionParameter; | |
210 _exceptionParameter = node.handler.parameters.first; | |
211 processLetHandler(node); | |
212 visit(node.handler); | 203 visit(node.handler); |
213 _exceptionParameter = previousExceptionParameter; | 204 _exceptionParameter = previousExceptionParameter; |
214 | 205 |
215 visit(node.body); | 206 return node.body; |
216 } | 207 } |
217 | 208 |
218 processThrow(Throw node) { | 209 processThrow(Throw node) { |
219 // The subexpression of throw is wrapped in the JavaScript output. | 210 // The subexpression of throw is wrapped in the JavaScript output. |
220 Parameter value = new Parameter(null); | 211 Parameter value = new Parameter(null); |
221 insertStaticCall(_glue.getWrapExceptionHelper(), [node.value.definition], | 212 insertStaticCall(_glue.getWrapExceptionHelper(), [node.value.definition], |
222 value, node); | 213 value, node); |
223 node.value.unlink(); | 214 node.value.unlink(); |
224 node.value = new Reference<Primitive>(value); | 215 node.value = new Reference<Primitive>(value); |
225 } | 216 } |
(...skipping 13 matching lines...) Expand all Loading... |
239 /// [selector]. | 230 /// [selector]. |
240 /// | 231 /// |
241 /// A single getInterceptor call will be created per primitive, bound | 232 /// A single getInterceptor call will be created per primitive, bound |
242 /// immediately after the primitive is bound. | 233 /// immediately after the primitive is bound. |
243 /// | 234 /// |
244 /// The type propagation pass will later narrow the set of interceptors | 235 /// The type propagation pass will later narrow the set of interceptors |
245 /// based on the input type, and the let sinking pass will propagate the | 236 /// based on the input type, and the let sinking pass will propagate the |
246 /// getInterceptor call closer to its use when this is profitable. | 237 /// getInterceptor call closer to its use when this is profitable. |
247 Interceptor getInterceptorFor(Primitive prim, Selector selector, | 238 Interceptor getInterceptorFor(Primitive prim, Selector selector, |
248 SourceInformation sourceInformation) { | 239 SourceInformation sourceInformation) { |
| 240 assert(prim is! Interceptor); |
249 Interceptor interceptor = interceptors[prim]; | 241 Interceptor interceptor = interceptors[prim]; |
250 if (interceptor == null) { | 242 if (interceptor == null) { |
251 interceptor = new Interceptor(prim, sourceInformation); | 243 interceptor = new Interceptor(prim, sourceInformation); |
252 interceptors[prim] = interceptor; | 244 interceptors[prim] = interceptor; |
253 InteriorNode parent = prim.parent; | 245 InteriorNode parent = prim.parent; |
254 insertLetPrim(interceptor, parent.body); | 246 insertLetPrim(interceptor, parent.body); |
255 if (prim.hint != null) { | 247 if (prim.hint != null) { |
256 interceptor.hint = new InterceptorEntity(prim.hint); | 248 interceptor.hint = new InterceptorEntity(prim.hint); |
257 } | 249 } |
258 } | 250 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 condition.value.unlink(); | 306 condition.value.unlink(); |
315 node.trueContinuation.unlink(); | 307 node.trueContinuation.unlink(); |
316 node.falseContinuation.unlink(); | 308 node.falseContinuation.unlink(); |
317 parent.body = newNode; | 309 parent.body = newNode; |
318 } | 310 } |
319 | 311 |
320 processInterceptor(Interceptor node) { | 312 processInterceptor(Interceptor node) { |
321 _glue.registerSpecializedGetInterceptor(node.interceptedClasses); | 313 _glue.registerSpecializedGetInterceptor(node.interceptedClasses); |
322 } | 314 } |
323 } | 315 } |
OLD | NEW |