Chromium Code Reviews| Index: pkg/compiler/lib/src/js_backend/codegen/unsugar.dart |
| diff --git a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart |
| index 1dc36271993f9d524509042924fcb36f4bda2a09..35c28738bd2f58a5f96b19c9231f9c525dec779b 100644 |
| --- a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart |
| +++ b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart |
| @@ -6,6 +6,8 @@ import '../../cps_ir/cps_ir_nodes.dart'; |
| import '../../cps_ir/optimizers.dart'; |
| import '../../constants/expressions.dart'; |
| import '../../constants/values.dart'; |
| +import '../../elements/elements.dart' show ClassElement; |
| +import '../../js_backend/codegen/glue.dart'; |
| /// Rewrites the initial CPS IR to make Dart semantics explicit and inserts |
| /// special nodes that respect JavaScript behavior. |
| @@ -13,7 +15,9 @@ import '../../constants/values.dart'; |
| /// Performs the following rewrites: |
| /// - rewrite [IsTrue] in a [Branch] to do boolean conversion. |
| class UnsugarVisitor extends RecursiveVisitor { |
| - const UnsugarVisitor(); |
| + Glue _glue; |
| + |
| + UnsugarVisitor(this._glue); |
| void rewrite(FunctionDefinition function) { |
| // Set all parent pointers. |
| @@ -33,6 +37,25 @@ class UnsugarVisitor extends RecursiveVisitor { |
| new TrueConstantValue())); |
| } |
| + processInvokeMethod(InvokeMethod node) { |
| + if (!_glue.isInterceptedSelector(node.selector)) return; |
| + Set<ClassElement> interceptedClasses = |
| + _glue.getInterceptedClassesOn(node.selector); |
| + _glue.registerSpecializedGetInterceptor(interceptedClasses); |
| + InteriorNode parent = node.parent; |
| + Primitive receiver = node.receiver.definition; |
| + Primitive intercepted = new Interceptor(receiver, interceptedClasses); |
| + LetPrim newNode = new LetPrim(intercepted, |
| + new InvokeMethod(intercepted, |
| + node.selector, |
| + node.continuation.definition, |
| + node.arguments.map( |
| + (Reference<Primitive> r) => r.definition).toList())); |
|
sigurdm
2014/12/16 11:44:55
It would be nicer if you could just pass the argum
sigurdm
2014/12/16 11:44:56
I would add the extra argument here instead of at
karlklose
2014/12/16 12:04:03
Done.
karlklose
2014/12/16 12:04:03
Done.
|
| + node.continuation.unlink(); |
| + node.receiver.unlink(); |
| + parent.body = newNode; |
| + } |
| + |
| processBranch(Branch node) { |
| // TODO(karlklose): implement the checked mode part of boolean conversion. |
| InteriorNode parent = node.parent; |