| 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 // TODO(karlklose): share the [ParentVisitor]. | 5 import '../../cps_ir/optimizers.dart' show ParentVisitor; |
| 6 import '../../cps_ir/optimizers.dart'; | |
| 7 import '../../constants/expressions.dart'; | 6 import '../../constants/expressions.dart'; |
| 8 import '../../constants/values.dart'; | 7 import '../../constants/values.dart'; |
| 9 import '../../elements/elements.dart' show | 8 import '../../elements/elements.dart' show |
| 10 ClassElement, | 9 ClassElement, |
| 11 FieldElement, | 10 FieldElement, |
| 12 FunctionElement, | 11 FunctionElement, |
| 13 Local, | 12 Local, |
| 14 ExecutableElement; | 13 ExecutableElement; |
| 15 import '../../js_backend/codegen/glue.dart'; | 14 import '../../js_backend/codegen/glue.dart'; |
| 16 import '../../dart2jslib.dart' show Selector, World; | 15 import '../../dart2jslib.dart' show Selector, World; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 // body; | 116 // body; |
| 118 // | 117 // |
| 119 // with | 118 // with |
| 120 // | 119 // |
| 121 // if (identical(arg, null)) | 120 // if (identical(arg, null)) |
| 122 // return false; | 121 // return false; |
| 123 // else | 122 // else |
| 124 // body; | 123 // body; |
| 125 // | 124 // |
| 126 Continuation originalBody = new Continuation(<Parameter>[]); | 125 Continuation originalBody = new Continuation(<Parameter>[]); |
| 127 originalBody.body = function.body.body; | 126 originalBody.body = function.body; |
| 128 | 127 |
| 129 Continuation returnFalse = new Continuation(<Parameter>[]); | 128 Continuation returnFalse = new Continuation(<Parameter>[]); |
| 130 Primitive falsePrimitive = falseConstant; | 129 Primitive falsePrimitive = falseConstant; |
| 131 returnFalse.body = | 130 returnFalse.body = |
| 132 new LetPrim(falsePrimitive, | 131 new LetPrim(falsePrimitive, |
| 133 new InvokeContinuation( | 132 new InvokeContinuation( |
| 134 function.body.returnContinuation, <Primitive>[falsePrimitive])); | 133 function.returnContinuation, <Primitive>[falsePrimitive])); |
| 135 | 134 |
| 136 Primitive nullPrimitive = nullConstant; | 135 Primitive nullPrimitive = nullConstant; |
| 137 Primitive test = new Identical(function.parameters.single, nullPrimitive); | 136 Primitive test = new Identical(function.parameters.single, nullPrimitive); |
| 138 | 137 |
| 139 Expression newBody = | 138 Expression newBody = |
| 140 new LetCont.many(<Continuation>[returnFalse, originalBody], | 139 new LetCont.many(<Continuation>[returnFalse, originalBody], |
| 141 new LetPrim(nullPrimitive, | 140 new LetPrim(nullPrimitive, |
| 142 new LetPrim(test, | 141 new LetPrim(test, |
| 143 new Branch( | 142 new Branch( |
| 144 new IsTrue(test), | 143 new IsTrue(test), |
| 145 returnFalse, | 144 returnFalse, |
| 146 originalBody)))); | 145 originalBody)))); |
| 147 function.body.body = newBody; | 146 function.body = newBody; |
| 148 } | 147 } |
| 149 | 148 |
| 150 /// Insert a static call to [function] at the point of [node] with result | 149 /// Insert a static call to [function] at the point of [node] with result |
| 151 /// [result]. | 150 /// [result]. |
| 152 /// | 151 /// |
| 153 /// Rewrite [node] to | 152 /// Rewrite [node] to |
| 154 /// | 153 /// |
| 155 /// let cont continuation(result) = node | 154 /// let cont continuation(result) = node |
| 156 /// in invoke function arguments continuation | 155 /// in invoke function arguments continuation |
| 157 void insertStaticCall(FunctionElement function, List<Primitive> arguments, | 156 void insertStaticCall(FunctionElement function, List<Primitive> arguments, |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 // TODO(sra): Move the computation of interceptedClasses to a much later | 249 // TODO(sra): Move the computation of interceptedClasses to a much later |
| 251 // phase and take into account the remaining uses of the interceptor. | 250 // phase and take into account the remaining uses of the interceptor. |
| 252 Set<ClassElement> interceptedClasses = | 251 Set<ClassElement> interceptedClasses = |
| 253 _glue.getInterceptedClassesOn(selector); | 252 _glue.getInterceptedClassesOn(selector); |
| 254 _glue.registerSpecializedGetInterceptor(interceptedClasses); | 253 _glue.registerSpecializedGetInterceptor(interceptedClasses); |
| 255 newReceiver = new Interceptor(receiver, interceptedClasses); | 254 newReceiver = new Interceptor(receiver, interceptedClasses); |
| 256 insertLetPrim(newReceiver, node); | 255 insertLetPrim(newReceiver, node); |
| 257 } | 256 } |
| 258 | 257 |
| 259 node.arguments.insert(0, node.receiver); | 258 node.arguments.insert(0, node.receiver); |
| 260 node.callingConvention = CallingConvention.JS_INTERCEPTED; | |
| 261 assert(node.isValid); | |
| 262 node.receiver = new Reference<Primitive>(newReceiver); | 259 node.receiver = new Reference<Primitive>(newReceiver); |
| 263 } | 260 } |
| 264 | 261 |
| 265 processInvokeMethodDirectly(InvokeMethodDirectly node) { | 262 processInvokeMethodDirectly(InvokeMethodDirectly node) { |
| 266 if (_glue.isInterceptedMethod(node.target)) { | 263 if (_glue.isInterceptedMethod(node.target)) { |
| 267 Primitive nullPrim = nullConstant; | 264 Primitive nullPrim = nullConstant; |
| 268 insertLetPrim(nullPrim, node); | 265 insertLetPrim(nullPrim, node); |
| 269 node.arguments.insert(0, node.receiver); | 266 node.arguments.insert(0, node.receiver); |
| 270 // TODO(sra): `null` is not adequate. Interceptors project the class | 267 // TODO(sra): `null` is not adequate. Interceptors project the class |
| 271 // hierarchy onto an interceptor hierarchy. A super call that does a | 268 // hierarchy onto an interceptor hierarchy. A super call that does a |
| (...skipping 18 matching lines...) Expand all Loading... |
| 290 condition.value.unlink(); | 287 condition.value.unlink(); |
| 291 node.trueContinuation.unlink(); | 288 node.trueContinuation.unlink(); |
| 292 node.falseContinuation.unlink(); | 289 node.falseContinuation.unlink(); |
| 293 parent.body = newNode; | 290 parent.body = newNode; |
| 294 } | 291 } |
| 295 | 292 |
| 296 processInterceptor(Interceptor node) { | 293 processInterceptor(Interceptor node) { |
| 297 _glue.registerSpecializedGetInterceptor(node.interceptedClasses); | 294 _glue.registerSpecializedGetInterceptor(node.interceptedClasses); |
| 298 } | 295 } |
| 299 } | 296 } |
| OLD | NEW |