Revert "Remove invalid nest check from isValidVirtualTarget predicate."
This reverts commit 8895fb3ca4d639ee9f64a1f39be25d90bcc6e22d.
Reason for revert: bots are failing
Change-Id: Ib090331dbf7794550c4c6bfbfcfa4cc04ed6285e
diff --git a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
index 2c60a43..3080960 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.SetUtils;
import com.google.common.collect.Sets;
import java.util.Collection;
@@ -56,12 +57,8 @@
public abstract boolean isAccessibleForVirtualDispatchFrom(
DexProgramClass context, AppInfoWithSubtyping appInfo);
- // TODO(b/145187573): Remove this and use proper access checks.
- @Deprecated
- public abstract boolean isValidVirtualTarget();
+ public abstract boolean isValidVirtualTarget(InternalOptions options);
- // TODO(b/145187573): Remove this and use proper access checks.
- @Deprecated
public abstract boolean isValidVirtualTargetForDynamicDispatch();
/** Lookup the single target of an invoke-special on this resolution result if possible. */
@@ -90,10 +87,10 @@
private final DexClass resolvedHolder;
private final DexEncodedMethod resolvedMethod;
- // TODO(b/145187573): Remove this and use proper access checks.
- @Deprecated
- public static boolean isValidVirtualTarget(DexEncodedMethod target) {
- return !target.accessFlags.isStatic() && !target.accessFlags.isConstructor();
+ public static boolean isValidVirtualTarget(InternalOptions options, DexEncodedMethod target) {
+ return options.canUseNestBasedAccess()
+ ? (!target.accessFlags.isStatic() && !target.accessFlags.isConstructor())
+ : target.isVirtualMethod();
}
public SingleResolutionResult(
@@ -144,8 +141,8 @@
}
@Override
- public boolean isValidVirtualTarget() {
- return isValidVirtualTarget(resolvedMethod);
+ public boolean isValidVirtualTarget(InternalOptions options) {
+ return isValidVirtualTarget(options, resolvedMethod);
}
@Override
@@ -304,7 +301,7 @@
@Override
// TODO(b/140204899): Leverage refined receiver type if available.
public Set<DexEncodedMethod> lookupVirtualTargets(AppInfoWithSubtyping appInfo) {
- assert isValidVirtualTarget();
+ assert isValidVirtualTarget(appInfo.app().options);
// First add the target for receiver type method.type.
DexEncodedMethod encodedMethod = getSingleTarget();
Set<DexEncodedMethod> result = SetUtils.newIdentityHashSet(encodedMethod);
@@ -328,7 +325,7 @@
@Override
// TODO(b/140204899): Leverage refined receiver type if available.
public Set<DexEncodedMethod> lookupInterfaceTargets(AppInfoWithSubtyping appInfo) {
- assert isValidVirtualTarget();
+ assert isValidVirtualTarget(appInfo.app().options);
Set<DexEncodedMethod> result = Sets.newIdentityHashSet();
if (isSingleResolution()) {
// Add default interface methods to the list of targets.
@@ -454,7 +451,7 @@
}
@Override
- public boolean isValidVirtualTarget() {
+ public boolean isValidVirtualTarget(InternalOptions options) {
return true;
}
@@ -493,7 +490,7 @@
}
@Override
- public boolean isValidVirtualTarget() {
+ public boolean isValidVirtualTarget(InternalOptions options) {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
index 0e6d2a3..c7939b5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
@@ -180,7 +180,7 @@
method -> {
ResolutionResult resolution =
appView.appInfo().resolveMethod(method.holder, method, isInterface);
- if (resolution.isValidVirtualTarget()) {
+ if (resolution.isValidVirtualTarget(appView.options())) {
return resolution.lookupVirtualDispatchTargets(isInterface, appView.appInfo());
}
return null;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
index 133eff3..e83a17a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
@@ -88,7 +88,7 @@
ResolutionResult resolutionResult =
appView.appInfo().resolveMethod(invokedMethod.holder, invokedMethod);
// For virtual and interface calls, proceed on valid results only (since it's enforced).
- if (!resolutionResult.isValidVirtualTarget()) {
+ if (!resolutionResult.isValidVirtualTarget(appView.options())) {
continue;
}
// If the resolution ended up with a single target, check if it is a library override.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index e0219c5..4977d4c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -352,7 +352,7 @@
// resolution result.
ResolutionResult resolutionResult =
appView.appInfo().resolveMethod(method.holder, method, isInterface);
- if (!resolutionResult.isValidVirtualTarget()) {
+ if (!resolutionResult.isValidVirtualTarget(appView.options())) {
return ConstraintWithTarget.NEVER;
}
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 4e248d9..25a7b15 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -979,7 +979,7 @@
private DexEncodedMethod validateSingleVirtualTarget(
DexEncodedMethod singleTarget, DexEncodedMethod resolutionResult) {
- assert SingleResolutionResult.isValidVirtualTarget(resolutionResult);
+ assert SingleResolutionResult.isValidVirtualTarget(options(), resolutionResult);
if (singleTarget == null || singleTarget == DexEncodedMethod.SENTINEL) {
return null;
@@ -996,7 +996,7 @@
private boolean isInvalidSingleVirtualTarget(
DexEncodedMethod singleTarget, DexEncodedMethod resolutionResult) {
- assert SingleResolutionResult.isValidVirtualTarget(resolutionResult);
+ assert SingleResolutionResult.isValidVirtualTarget(options(), resolutionResult);
// Art978_virtual_interfaceTest correctly expects an IncompatibleClassChangeError exception
// at runtime.
return !singleTarget.accessFlags.isAtLeastAsVisibleAs(resolutionResult.accessFlags);
@@ -1081,7 +1081,7 @@
// First get the target for the holder type.
ResolutionResult topMethod = resolveMethodOnClass(holder, method);
// We might hit none or multiple targets. Both make this fail at runtime.
- if (!topMethod.isSingleResolution() || !topMethod.isValidVirtualTarget()) {
+ if (!topMethod.isSingleResolution() || !topMethod.isValidVirtualTarget(options())) {
method.setSingleVirtualMethodCache(refinedReceiverType, null);
return null;
}
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 1fa2300..4b412cf 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1658,7 +1658,7 @@
}
private void markResolutionAsLive(DexClass libraryClass, ResolutionResult resolution) {
- if (resolution.isValidVirtualTarget()) {
+ if (resolution.isValidVirtualTarget(options)) {
DexEncodedMethod target = resolution.getSingleTarget();
DexProgramClass targetHolder = getProgramClassOrNull(target.method.holder);
if (targetHolder != null
@@ -2004,7 +2004,7 @@
resolution = findAndMarkResolutionTarget(method, interfaceInvoke, reason);
virtualTargetsMarkedAsReachable.put(method, resolution);
if (resolution.isUnresolved()
- || !SingleResolutionResult.isValidVirtualTarget(resolution.method)) {
+ || !SingleResolutionResult.isValidVirtualTarget(options, resolution.method)) {
// There is no valid resolution, so any call will lead to a runtime exception.
return;
}
@@ -2035,7 +2035,7 @@
MarkedResolutionTarget reason,
BiPredicate<DexProgramClass, DexEncodedMethod> possibleTargetsFilter,
DexEncodedMethod encodedPossibleTarget) {
- assert encodedPossibleTarget.isVirtualMethod() || encodedPossibleTarget.isPrivateMethod();
+ assert encodedPossibleTarget.isVirtualMethod() || options.canUseNestBasedAccess();
assert !encodedPossibleTarget.isAbstract();
DexMethod possibleTarget = encodedPossibleTarget.method;
DexProgramClass clazz = getProgramClassOrNull(possibleTarget.holder);
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index bd05dc3..b86857a 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -533,7 +533,8 @@
}
ResolutionResult resolutionResult =
appView.appInfo().resolveMethod(originalClazz, method.method);
- if (!resolutionResult.isValidVirtualTarget() || !resolutionResult.isSingleResolution()) {
+ if (!resolutionResult.isValidVirtualTarget(appView.options())
+ || !resolutionResult.isSingleResolution()) {
return;
}
DexEncodedMethod methodToKeep = resolutionResult.getSingleTarget();
diff --git a/src/test/java/com/android/tools/r8/resolution/PrivateInvokeVirtualTest.java b/src/test/java/com/android/tools/r8/resolution/PrivateInvokeVirtualTest.java
deleted file mode 100644
index 543ecad..0000000
--- a/src/test/java/com/android/tools/r8/resolution/PrivateInvokeVirtualTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.resolution;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import java.io.IOException;
-import java.util.concurrent.ExecutionException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-import org.objectweb.asm.Opcodes;
-
-@RunWith(Parameterized.class)
-public class PrivateInvokeVirtualTest extends TestBase {
-
- private final TestParameters parameters;
-
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withAllRuntimesAndApiLevels().build();
- }
-
- public PrivateInvokeVirtualTest(TestParameters parameters) {
- this.parameters = parameters;
- }
-
- public static class UInt implements Comparable<UInt> {
-
- private final int val;
-
- public UInt(int val) {
- this.val = val;
- }
-
- private int compareToHelper(int i) {
- return Integer.compare(val, i);
- }
-
- @Override
- public int compareTo(UInt o) {
- return compareToHelper(o.val);
- }
- }
-
- public static class Main {
-
- public static void main(String[] args) {
- System.out.println(new UInt(3).compareTo(new UInt(args.length)));
- }
- }
-
- @Test
- public void testRuntime() throws IOException, CompilationFailedException, ExecutionException {
- testForRuntime(parameters)
- .addProgramClassFileData(getUIntWithTransformedInvoke())
- .addProgramClasses(Main.class)
- .run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutputLines("1");
- }
-
- @Test
- public void testPrivateInvokeVirtual()
- throws IOException, CompilationFailedException, ExecutionException {
- testForR8(parameters.getBackend())
- .addProgramClasses(Main.class)
- .addProgramClassFileData(getUIntWithTransformedInvoke())
- .addKeepMainRule(Main.class)
- .setMinApi(parameters.getApiLevel())
- .run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutputLines("1");
- }
-
- private byte[] getUIntWithTransformedInvoke() throws IOException {
- return transformer(UInt.class)
- .transformMethodInsnInMethod(
- "compareTo",
- (opcode, owner, name, descriptor, isInterface, continuation) -> {
- if (name.contains("compareToHelper")) {
- assertEquals(Opcodes.INVOKESPECIAL, opcode);
- continuation.apply(Opcodes.INVOKEVIRTUAL, owner, name, descriptor, isInterface);
- } else {
- continuation.apply(opcode, owner, name, descriptor, isInterface);
- }
- })
- .transform();
- }
-}
diff --git a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
index 27c7724..b1bcb52 100644
--- a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
@@ -228,7 +228,7 @@
Assert.assertNotNull(
appInfo.resolveMethod(toType(invokeReceiver, appInfo), method).getSingleTarget());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- if (resolutionResult.isValidVirtualTarget()) {
+ if (resolutionResult.isValidVirtualTarget(appInfo.app().options)) {
Set<DexEncodedMethod> targets = resolutionResult.lookupVirtualTargets(appInfo);
Set<DexType> targetHolders =
targets.stream().map(m -> m.method.holder).collect(Collectors.toSet());
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
index 82452a8..63aa76f 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
@@ -122,7 +122,7 @@
appInfo.resolveMethodOnInterface(methodOnB.holder, methodOnB);
DexEncodedMethod resolved = resolutionResult.getSingleTarget();
assertEquals(methodOnB, resolved.method);
- assertFalse(resolutionResult.isValidVirtualTarget());
+ assertFalse(resolutionResult.isValidVirtualTarget(appInfo.app().options));
DexEncodedMethod singleVirtualTarget =
appInfo.lookupSingleInterfaceTarget(methodOnB, methodOnB.holder);
Assert.assertNull(singleVirtualTarget);
@@ -133,7 +133,7 @@
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(methodOnB.holder, methodOnB);
DexEncodedMethod resolved = resolutionResult.getSingleTarget();
assertEquals(methodOnB, resolved.method);
- assertFalse(resolutionResult.isValidVirtualTarget());
+ assertFalse(resolutionResult.isValidVirtualTarget(appInfo.app().options));
}
@Test
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
index 702eca9..22a12f2 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
@@ -168,7 +168,7 @@
ResolutionResult resolutionResult = appInfo.resolveMethodOnClass(methodOnB.holder, methodOnB);
DexEncodedMethod resolved = resolutionResult.getSingleTarget();
assertEquals(methodOnA, resolved.method);
- assertFalse(resolutionResult.isValidVirtualTarget());
+ assertFalse(resolutionResult.isValidVirtualTarget(appInfo.app().options));
DexEncodedMethod singleVirtualTarget =
appInfo.lookupSingleVirtualTarget(methodOnB, methodOnB.holder);
Assert.assertNull(singleVirtualTarget);
@@ -179,7 +179,7 @@
ResolutionResult resolutionResult = appInfo.resolveMethodOnClass(methodOnB.holder, methodOnB);
DexEncodedMethod resolved = resolutionResult.getSingleTarget();
assertEquals(methodOnA, resolved.method);
- assertFalse(resolutionResult.isValidVirtualTarget());
+ assertFalse(resolutionResult.isValidVirtualTarget(appInfo.app().options));
}
@Test