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, Pass; | 5 import '../../cps_ir/optimizers.dart' show ParentVisitor, Pass; |
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 '../../universe/selector.dart' show Selector; | 10 import '../../universe/selector.dart' show Selector; |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 // Rethrow can only appear in a catch block. It throws that block's | 222 // Rethrow can only appear in a catch block. It throws that block's |
223 // (wrapped) caught exception. | 223 // (wrapped) caught exception. |
224 Throw replacement = new Throw(_exceptionParameter); | 224 Throw replacement = new Throw(_exceptionParameter); |
225 InteriorNode parent = node.parent; | 225 InteriorNode parent = node.parent; |
226 parent.body = replacement; | 226 parent.body = replacement; |
227 replacement.parent = parent; | 227 replacement.parent = parent; |
228 // The original rethrow does not have any references that we need to | 228 // The original rethrow does not have any references that we need to |
229 // worry about unlinking. | 229 // worry about unlinking. |
230 } | 230 } |
231 | 231 |
232 // TODO(24523): Insert interceptor on demand when we discover we want to use | |
233 // one rather than on every check. | |
234 processTypeTest(TypeTest node) { | |
235 assert(node.interceptor == null); | |
236 Primitive receiver = node.value.definition; | |
237 Primitive interceptor = new Interceptor(receiver, node.sourceInformation) | |
238 ..interceptedClasses.addAll(_glue.interceptedClasses); | |
239 insertLetPrim(interceptor, node.parent); | |
240 node.interceptor = new Reference<Primitive>(interceptor); | |
241 node.interceptor.parent = node; | |
242 } | |
243 | |
244 processInvokeMethod(InvokeMethod node) { | 232 processInvokeMethod(InvokeMethod node) { |
245 Selector selector = node.selector; | 233 Selector selector = node.selector; |
246 if (!_glue.isInterceptedSelector(selector)) return; | 234 if (!_glue.isInterceptedSelector(selector)) return; |
247 | 235 |
248 Primitive receiver = node.receiver.definition; | 236 Primitive receiver = node.receiver.definition; |
249 Primitive newReceiver; | 237 Primitive newReceiver; |
250 | 238 |
251 if (receiver == explicitReceiverParameter) { | 239 if (receiver == explicitReceiverParameter) { |
252 // If the receiver is the explicit receiver, we are calling a method in | 240 // If the receiver is the explicit receiver, we are calling a method in |
253 // the same interceptor: | 241 // the same interceptor: |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 insertLetPrim(newReceiver, contBinding); | 277 insertLetPrim(newReceiver, contBinding); |
290 } | 278 } |
291 node.arguments.insert(0, node.receiver); | 279 node.arguments.insert(0, node.receiver); |
292 node.receiver = new Reference<Primitive>(newReceiver); | 280 node.receiver = new Reference<Primitive>(newReceiver); |
293 } | 281 } |
294 | 282 |
295 processInterceptor(Interceptor node) { | 283 processInterceptor(Interceptor node) { |
296 _glue.registerSpecializedGetInterceptor(node.interceptedClasses); | 284 _glue.registerSpecializedGetInterceptor(node.interceptedClasses); |
297 } | 285 } |
298 } | 286 } |
OLD | NEW |