Revert "Check if methods are overriding if they are seen when marking live"
This reverts commit ff3be41f81842f39328d9043e2a3e81d6e5bd1b2.
Reason for revert: Bots are failing
Change-Id: I0f71cbba332688d85911f724c4f33f5b7b50bff3
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 8c70605..331466b 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -5,13 +5,11 @@
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
import static com.android.tools.r8.graph.FieldAccessInfoImpl.MISSING_FIELD_ACCESS_INFO;
-import static com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult.isOverriding;
import static com.android.tools.r8.ir.desugar.LambdaDescriptor.isLambdaMetafactoryMethod;
import static com.android.tools.r8.ir.optimize.enums.UnboxedEnumMemberRelocator.ENUM_UNBOXING_UTILITY_CLASS_SUFFIX;
import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentifier;
import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
import static com.android.tools.r8.shaking.AnnotationRemover.shouldKeepAnnotation;
-import static com.android.tools.r8.utils.FunctionUtils.ignoreArgument;
import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.cf.code.CfInstruction;
@@ -142,6 +140,7 @@
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
@@ -2364,13 +2363,11 @@
*/
private void transitionMethodsForInstantiatedObject(
InstantiatedObject instantiation, DexClass clazz, List<DexType> interfaces) {
- Map<Wrapper<DexMethod>, List<DexEncodedMethod>> seen = new HashMap<>();
+ Set<Wrapper<DexMethod>> seen = new HashSet<>();
WorkList<DexType> worklist = WorkList.newIdentityWorkList();
worklist.addIfNotSeen(interfaces);
// First we lookup and mark all targets on the instantiated class for each reachable method in
// the super chain (inclusive).
- // TODO(b/182458496): Consider changing this algorithm to a version that collects all reachable
- // methods and then does lookup.
DexClass initialClass = clazz;
while (clazz != null) {
if (clazz.isProgramClass()) {
@@ -2408,25 +2405,14 @@
private void markProgramMethodOverridesAsLive(
InstantiatedObject instantiation,
DexClass initialClass,
- DexProgramClass currentClass,
- Map<Wrapper<DexMethod>, List<DexEncodedMethod>> seenMethods) {
- for (DexMethod method : getReachableVirtualTargets(currentClass)) {
- assert method.holder == currentClass.type;
+ DexProgramClass superClass,
+ Set<Wrapper<DexMethod>> seenMethods) {
+ for (DexMethod method : getReachableVirtualTargets(superClass)) {
+ assert method.holder == superClass.type;
Wrapper<DexMethod> signature = MethodSignatureEquivalence.get().wrap(method);
- // TODO(b/182456011): Could reachableVirtalTarget be dex encoded methods.
- DexEncodedMethod currentTarget = definitionFor(method, currentClass);
- List<DexEncodedMethod> potentialOverrides =
- seenMethods.computeIfAbsent(signature, ignoreArgument(ArrayList::new));
- boolean notOverridingCurrentTarget = potentialOverrides.isEmpty();
- for (DexEncodedMethod potentialOverride : potentialOverrides) {
- if (!isOverriding(currentTarget, potentialOverride)) {
- notOverridingCurrentTarget = true;
- break;
- }
- }
- if (notOverridingCurrentTarget) {
+ if (!seenMethods.contains(signature)) {
SingleResolutionResult resolution =
- appInfo.resolveMethodOn(currentClass, method).asSingleResolution();
+ appInfo.resolveMethodOn(superClass, method).asSingleResolution();
assert resolution != null;
assert resolution.getResolvedHolder().isProgramClass();
if (resolution != null) {
@@ -2434,11 +2420,11 @@
|| resolution
.isAccessibleForVirtualDispatchFrom(initialClass.asProgramClass(), appInfo)
.isTrue()) {
- potentialOverrides.add(currentTarget);
+ seenMethods.add(signature);
}
if (resolution.getResolvedHolder().isProgramClass()) {
markLiveOverrides(
- instantiation, currentClass, resolution.getResolutionPair().asProgramMethod());
+ instantiation, superClass, resolution.getResolutionPair().asProgramMethod());
}
}
}
diff --git a/src/main/java/com/android/tools/r8/utils/FunctionUtils.java b/src/main/java/com/android/tools/r8/utils/FunctionUtils.java
index acd5cb3..3338dde 100644
--- a/src/main/java/com/android/tools/r8/utils/FunctionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/FunctionUtils.java
@@ -7,7 +7,6 @@
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
-import java.util.function.Supplier;
public class FunctionUtils {
@@ -29,8 +28,4 @@
func.apply(t).accept(argument);
}
}
-
- public static <T, R> Function<T, R> ignoreArgument(Supplier<R> supplier) {
- return ignore -> supplier.get();
- }
}
diff --git a/src/test/java/com/android/tools/r8/shaking/AbstractSuperClassLiveMethodTest.java b/src/test/java/com/android/tools/r8/shaking/AbstractSuperClassLiveMethodTest.java
index f9583f7..8cdd48e 100644
--- a/src/test/java/com/android/tools/r8/shaking/AbstractSuperClassLiveMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/AbstractSuperClassLiveMethodTest.java
@@ -69,7 +69,8 @@
.applyIf(
parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isDalvik(),
r -> r.assertSuccessWithOutputLines(EXPECTED_DALVIK),
- r -> r.assertSuccessWithOutputLines(EXPECTED));
+ // TODO(b/182444403): Should succeed with EXPECTED.
+ r -> r.assertFailureWithErrorThatThrows(AbstractMethodError.class));
}
@NoVerticalClassMerging