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

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

Issue 119673004: Version 1.1.0-dev.5.2 (Closed) Base URL: http://dart.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 11 months 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: dart/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
===================================================================
--- dart/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart (revision 31530)
+++ dart/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart (working copy)
@@ -186,7 +186,7 @@
if (interceptedClasses.contains(backend.jsNumberClass)
&& !(interceptedClasses.contains(backend.jsDoubleClass)
|| interceptedClasses.contains(backend.jsIntClass))) {
- for (HInstruction user in node.usedBy) {
+ for (var user in node.usedBy) {
if (user is! HInvoke) continue;
Set<ClassElement> intercepted =
backend.getInterceptedClassesOn(user.selector.name);
@@ -200,7 +200,7 @@
}
} else {
interceptedClasses = new Set<ClassElement>();
- for (HInstruction user in node.usedBy) {
+ for (var user in node.usedBy) {
if (user is HIs) {
// Is-checks can be performed on any intercepted class.
interceptedClasses.addAll(backend.interceptedClasses);
@@ -215,7 +215,8 @@
HInstruction receiver = node.receiver;
if (canUseSelfForInterceptor(receiver, interceptedClasses)) {
- return rewriteToUseSelfAsInterceptor(node, receiver);
+ node.block.rewrite(node, receiver);
+ return false;
}
// Try computing a constant interceptor.
@@ -253,51 +254,6 @@
return true;
}
- bool rewriteToUseSelfAsInterceptor(HInterceptor node, HInstruction receiver) {
- // `rewrite` below clears `node.usedBy`.
- List<HInstruction> originalUsers = node.usedBy.toList();
-
- node.block.rewrite(node, receiver);
-
- // We have just rewritten:
- //
- // m = getInterceptor(a)
- // m.foo$1(a, x)
- // -->
- // m = getInterceptor(a)
- // a.foo$1(a, x)
- //
- // For the rewritten calls, if the selector matches only methods that ignore
- // the explicit receiver parameter, replace occurences of the receiver
- // argument with a dummy receiver '0':
- //
- // a.foo$1(a, x) --> a.foo$1(0, x)
- //
- JavaScriptBackend backend = compiler.backend;
- for (HInstruction user in originalUsers) {
- if (user is HInvokeDynamic) {
- HInvokeDynamic invoke = user;
- if (invoke.receiver == receiver &&
- !backend.isInterceptedMixinSelector(invoke.selector)) {
- HInstruction receiverArgument = invoke.inputs[1];
- // TODO(15720): The test here should be
- //
- // invoke.receiver.nonCheck() == receiverArgument.nonCheck()
- //
- if (invoke.receiver == receiverArgument) { // recognize a.foo(a,...)
- Constant constant = new DummyReceiverConstant(
- receiverArgument.instructionType);
- HConstant dummy = graph.addConstant(constant, compiler);
- receiverArgument.usedBy.remove(invoke);
- invoke.inputs[1] = dummy;
- dummy.usedBy.add(invoke);
- }
- }
- }
- }
- return false;
- }
-
bool visitOneShotInterceptor(HOneShotInterceptor node) {
HInstruction constant = tryComputeConstantInterceptor(
node.inputs[1], node.interceptedClasses);

Powered by Google App Engine
This is Rietveld 408576698