Merge "Transfer publicized bit to bridge in class merger"
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 69126be..3586d6d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -758,6 +758,10 @@
publicized = true;
}
+ private void unsetPublicized() {
+ publicized = false;
+ }
+
private void markUseIdentifierNameString() {
useIdentifierNameString = true;
}
@@ -835,6 +839,10 @@
ensureMutableOI().markPublicized();
}
+ synchronized public void unsetPublicized() {
+ ensureMutableOI().unsetPublicized();
+ }
+
synchronized public void markUseIdentifierNameString() {
ensureMutableOI().markUseIdentifierNameString();
}
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 0ed3c11..4a36895 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -940,15 +940,15 @@
}
private DexEncodedMethod buildBridgeMethod(
- DexEncodedMethod signature, DexMethod invocationTarget) {
+ DexEncodedMethod method, DexMethod invocationTarget) {
DexType holder = target.type;
DexProto proto = invocationTarget.proto;
- DexString name = signature.method.name;
- MethodAccessFlags accessFlags = signature.accessFlags.copy();
+ DexString name = method.method.name;
+ MethodAccessFlags accessFlags = method.accessFlags.copy();
accessFlags.setBridge();
accessFlags.setSynthetic();
accessFlags.unsetAbstract();
- return new DexEncodedMethod(
+ DexEncodedMethod bridge = new DexEncodedMethod(
application.dexItemFactory.createMethod(holder, proto, name),
accessFlags,
DexAnnotationSet.empty(),
@@ -956,7 +956,14 @@
new SynthesizedCode(
new ForwardMethodSourceCode(holder, proto, holder, invocationTarget, Type.DIRECT),
registry -> registry.registerInvokeDirect(invocationTarget)),
- signature.hasClassFileVersion() ? signature.getClassFileVersion() : -1);
+ method.hasClassFileVersion() ? method.getClassFileVersion() : -1);
+ if (method.getOptimizationInfo().isPublicized()) {
+ // The bridge is now the public method serving the role of the original method, and should
+ // reflect that this method was publicized.
+ bridge.markPublicized();
+ method.unsetPublicized();
+ }
+ return bridge;
}
// Returns the method that shadows the given method, or null if method is not shadowed.