Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(351)

Unified Diff: pkg/compiler/lib/src/js_backend/codegen/unsugar.dart

Issue 806103003: cps-ir: Add support for intercepted calls. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Disable debug print. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698