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

Unified Diff: sdk/lib/_internal/compiler/implementation/ssa/builder.dart

Issue 11411147: Address review comments on issue 11412105. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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: sdk/lib/_internal/compiler/implementation/ssa/builder.dart
===================================================================
--- sdk/lib/_internal/compiler/implementation/ssa/builder.dart (revision 15278)
+++ sdk/lib/_internal/compiler/implementation/ssa/builder.dart (working copy)
@@ -2438,14 +2438,8 @@
// If we're using an interceptor class, emit a call to the
// interceptor method and then the actual dynamic call on the
// interceptor object.
- HInstruction instruction;
- if (backend.isInterceptorClass(currentElement.getEnclosingClass())
- && send.receiver == null) {
- instruction = thisInstruction;
- } else {
- pushInvokeInterceptor(interceptedClasses, receiver);
- instruction = pop();
- }
+ HInstruction instruction =
+ invokeInterceptor(interceptedClasses, receiver, send);
instruction = new HInvokeDynamicGetter(
selector, null, instruction, !hasGetter);
// Add the receiver as an argument to the getter call on the
@@ -2509,16 +2503,10 @@
getInterceptedClassesOn(send, selector);
if (interceptedClasses != null) {
// If we're using an interceptor class, emit a call to the
- // interceptor method and then the actual dynamic call on the
+ // getInterceptor method and then the actual dynamic call on the
// interceptor object.
- HInstruction instruction;
- if (backend.isInterceptorClass(currentElement.getEnclosingClass())
- && send.receiver == null) {
- instruction = thisInstruction;
- } else {
- pushInvokeInterceptor(interceptedClasses, receiver);
- instruction = pop();
- }
+ HInstruction instruction =
+ invokeInterceptor(interceptedClasses, receiver, send);
instruction = new HInvokeDynamicSetter(
selector, null, instruction, receiver, !hasSetter);
// Add the value as an argument to the setter call on the
@@ -2568,9 +2556,17 @@
}
}
- void pushInvokeInterceptor(Set<ClassElement> intercepted,
- HInstruction receiver) {
- push(new HInterceptor(intercepted, receiver));
+ HInstruction invokeInterceptor(Set<ClassElement> intercepted,
+ HInstruction receiver,
+ Send send) {
+ if (send != null
+ && backend.isInterceptorClass(currentElement.getEnclosingClass())
+ && send.receiver == null) {
+ return thisInstruction;
+ }
+ HInterceptor interceptor = new HInterceptor(intercepted, receiver);
+ add(interceptor);
+ return interceptor;
}
void pushInvokeHelper0(Element helper) {
@@ -2774,7 +2770,6 @@
visitDynamicSend(Send node) {
Selector selector = elements.getSelector(node);
- var inputs = <HInstruction>[];
SourceString dartMethodName;
bool isNotEquals = false;
@@ -2790,29 +2785,6 @@
dartMethodName = node.selector.asIdentifier().source;
}
- Set<ClassElement> interceptedClasses =
- getInterceptedClassesOn(node, selector);
-
- if (interceptedClasses != null) {
- if (backend.isInterceptorClass(currentElement.getEnclosingClass())
- && node.receiver == null) {
- inputs.add(thisInstruction);
- inputs.add(localsHandler.readThis());
- } else {
- visit(node.receiver);
- HInstruction receiver = pop();
- pushInvokeInterceptor(interceptedClasses, receiver);
- inputs.add(pop());
- inputs.add(receiver);
- }
- addDynamicSendArgumentsToList(node, inputs);
- // The first entry in the inputs list is the interceptor. The
- // second is the receiver, and the others are the arguments.
- HInstruction instruction = new HInvokeDynamicMethod(selector, inputs);
- pushWithPosition(instruction, node);
- return;
- }
-
Element element = elements[node];
if (element != null && compiler.world.hasNoOverridingMember(element)) {
if (tryInlineMethod(element, selector, node.arguments)) {
@@ -2820,16 +2792,24 @@
}
}
+ HInstruction receiver;
if (node.receiver == null) {
- inputs.add(localsHandler.readThis());
+ receiver = localsHandler.readThis();
} else {
visit(node.receiver);
- inputs.add(pop());
+ receiver = pop();
}
+ List<HInstruction> inputs = <HInstruction>[];
+ Set<ClassElement> interceptedClasses =
+ interceptors.getInterceptedClassesOn(selector);
+ if (interceptedClasses != null) {
+ inputs.add(invokeInterceptor(interceptedClasses, receiver, node));
+ }
+ inputs.add(receiver);
+
addDynamicSendArgumentsToList(node, inputs);
- // The first entry in the inputs list is the receiver.
pushWithPosition(new HInvokeDynamicMethod(selector, inputs), node);
if (isNotEquals) {
@@ -3828,8 +3808,8 @@
if (interceptedClasses == null) {
iterator = new HInvokeDynamicMethod(selector, <HInstruction>[receiver]);
} else {
- pushInvokeInterceptor(interceptedClasses, receiver);
- HInterceptor interceptor = pop();
+ HInterceptor interceptor =
+ invokeInterceptor(interceptedClasses, receiver, null);
iterator = new HInvokeDynamicMethod(
selector, <HInstruction>[interceptor, receiver]);
}

Powered by Google App Engine
This is Rietveld 408576698