Remove uses of definitionFor(DexMethod)
Bug: 157616970
Change-Id: I1282385856bbe3dd9c5a64a141975dcb0a1c4bf8
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethod.java b/src/main/java/com/android/tools/r8/graph/DexMethod.java
index 7ae7c48..8a50931 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethod.java
@@ -57,6 +57,11 @@
}
@Override
+ public DexEncodedMethod lookupOnClass(DexClass clazz) {
+ return clazz != null ? clazz.lookupMember(this) : null;
+ }
+
+ @Override
public String toString() {
return "Method " + holder + "." + name + " " + proto.toString();
}
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 9dfa92e..5d5a16e 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -44,6 +44,7 @@
import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
import com.android.tools.r8.ir.desugar.TwrCloseResourceRewriter;
+import com.android.tools.r8.utils.AssertionUtils;
import com.android.tools.r8.utils.CollectionUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
@@ -60,7 +61,6 @@
import java.util.Deque;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
@@ -984,13 +984,13 @@
assert lens.assertDefinitionsNotModified(
neverMerge.stream()
.map(this::definitionFor)
- .filter(Objects::nonNull)
+ .filter(AssertionUtils::assertNotNull)
.collect(Collectors.toList()));
assert lens.assertDefinitionsNotModified(
alwaysInline.stream()
- .map(this::definitionFor)
- .filter(Objects::nonNull)
+ .map(method -> method.lookupOnClass(definitionForHolder(method)))
+ .filter(AssertionUtils::assertNotNull)
.collect(Collectors.toList()));
return new AppInfoWithLiveness(
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 5b3e34f..fd29fbc 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -717,16 +717,19 @@
if (!include.test(method.holder)) {
return;
}
+ DexProgramClass holder = asProgramClassOrNull(appInfo.definitionForHolder(method));
+ DexEncodedMethod definition = method.lookupOnClass(holder);
+ if (definition == null) {
+ assert false;
+ return;
+ }
out.print(method.holder.toSourceString() + ": ");
- DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
- if (encodedMethod.accessFlags.isConstructor()) {
- if (encodedMethod.accessFlags.isStatic()) {
- out.print(Constants.CLASS_INITIALIZER_NAME);
- } else {
- String holderName = method.holder.toSourceString();
- String constrName = holderName.substring(holderName.lastIndexOf('.') + 1);
- out.print(constrName);
- }
+ if (definition.isClassInitializer()) {
+ out.print(Constants.CLASS_INITIALIZER_NAME);
+ } else if (definition.isInstanceInitializer()) {
+ String holderName = method.holder.toSourceString();
+ String constrName = holderName.substring(holderName.lastIndexOf('.') + 1);
+ out.print(constrName);
} else {
out.print(
method.proto.returnType.toSourceString() + " " + method.name.toSourceString());
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 6940dde..2b06548 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -49,6 +49,7 @@
import com.android.tools.r8.ir.synthetic.AbstractSynthesizedCode;
import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
import com.android.tools.r8.logging.Log;
+import com.android.tools.r8.utils.AssertionUtils;
import com.android.tools.r8.utils.Box;
import com.android.tools.r8.utils.FieldSignatureEquivalence;
import com.android.tools.r8.utils.MethodSignatureEquivalence;
@@ -75,7 +76,6 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -655,8 +655,8 @@
private boolean verifyGraphLens(VerticalClassMergerGraphLense graphLense) {
assert graphLense.assertDefinitionsNotModified(
appInfo.alwaysInline.stream()
- .map(appInfo::definitionFor)
- .filter(Objects::nonNull)
+ .map(method -> method.lookupOnClass(appView.definitionForHolder(method)))
+ .filter(AssertionUtils::assertNotNull)
.collect(Collectors.toList()));
assert graphLense.assertReferencesNotModified(appInfo.noSideEffects.keySet());
@@ -1824,7 +1824,7 @@
return true;
}
- private boolean checkMethodReference(DexMethod method) {
+ private boolean checkMethodReference(DexMethod method, OptionalBool isInterface) {
if (!foundIllegalAccess) {
DexType baseType =
appView.graphLense().lookupType(method.holder.toBaseType(appView.dexItemFactory()));
@@ -1834,8 +1834,12 @@
for (DexType type : method.proto.parameters.values) {
checkTypeReference(type);
}
- DexEncodedMethod definition = appView.definitionFor(method);
- if (definition == null || !definition.accessFlags.isPublic()) {
+ ResolutionResult resolutionResult =
+ isInterface.isUnknown()
+ ? appView.appInfo().unsafeResolveMethodDueToDexFormat(method)
+ : appView.appInfo().resolveMethod(method, isInterface.isTrue());
+ if (!resolutionResult.isSingleResolution()
+ || !resolutionResult.asSingleResolution().getResolvedMethod().isPublic()) {
foundIllegalAccess = true;
}
}
@@ -1867,7 +1871,7 @@
assert context != null;
GraphLenseLookupResult lookup =
appView.graphLense().lookupMethod(method, context.getReference(), Type.VIRTUAL);
- return checkMethodReference(lookup.getMethod());
+ return checkMethodReference(lookup.getMethod(), OptionalBool.FALSE);
}
@Override
@@ -1875,7 +1879,7 @@
assert context != null;
GraphLenseLookupResult lookup =
appView.graphLense().lookupMethod(method, context.getReference(), Type.DIRECT);
- return checkMethodReference(lookup.getMethod());
+ return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN);
}
@Override
@@ -1883,7 +1887,7 @@
assert context != null;
GraphLenseLookupResult lookup =
appView.graphLense().lookupMethod(method, context.getReference(), Type.STATIC);
- return checkMethodReference(lookup.getMethod());
+ return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN);
}
@Override
@@ -1891,7 +1895,7 @@
assert context != null;
GraphLenseLookupResult lookup =
appView.graphLense().lookupMethod(method, context.getReference(), Type.INTERFACE);
- return checkMethodReference(lookup.getMethod());
+ return checkMethodReference(lookup.getMethod(), OptionalBool.TRUE);
}
@Override
@@ -1899,7 +1903,7 @@
assert context != null;
GraphLenseLookupResult lookup =
appView.graphLense().lookupMethod(method, context.getReference(), Type.SUPER);
- return checkMethodReference(lookup.getMethod());
+ return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/utils/AssertionUtils.java b/src/main/java/com/android/tools/r8/utils/AssertionUtils.java
new file mode 100644
index 0000000..c185096
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/AssertionUtils.java
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, 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.utils;
+
+public class AssertionUtils {
+
+ public static boolean assertNotNull(Object o) {
+ assert o != null;
+ return true;
+ }
+}