Only create -IA classes for nest host and use that for members as well
Bug: b/359546659
Change-Id: Ied2cd7791651860f8a5cda7dae1d819a78daae41
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index fb052fb..fcd5428 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexClasspathClass;
import com.android.tools.r8.graph.DexMethod;
@@ -288,7 +289,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
// Intentionally empty.
}
@@ -722,7 +723,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
// Intentionally empty.
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
index a4465a9..93b2f34 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
@@ -13,7 +13,6 @@
import com.android.tools.r8.graph.DexClasspathClass;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.conversion.D8MethodProcessor;
@@ -109,7 +108,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
}
@@ -229,8 +228,7 @@
private void ensureConstructorBridgeFromClasspathAccess(
ProgramMethod method, NestBasedAccessDesugaringEventConsumer eventConsumer) {
assert method.getDefinition().isInstanceInitializer();
- DexProgramClass constructorArgumentClass =
- ensureConstructorArgumentClass(method).asProgramClass();
+ DexClass constructorArgumentClass = ensureConstructorArgumentClass(method);
DexMethod bridgeReference = getConstructorBridgeReference(method, constructorArgumentClass);
synchronized (method.getHolder().getMethodCollection()) {
if (method.getHolder().lookupMethod(bridgeReference) == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 10f3501..55221e7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -232,7 +232,7 @@
: AccessBridgeFactory.createMethodAccessorBridge(
bridgeAndTarget.getBridge(), targetMethod, dexItemFactory));
if (targetMethod.getDefinition().isInstanceInitializer()) {
- DexProgramClass argumentClass = getConstructorArgumentClass(targetMethod).asProgramClass();
+ DexClass argumentClass = getConstructorArgumentClass(targetMethod);
eventConsumer.acceptNestConstructorBridge(targetMethod, bridgeMethod, argumentClass, context);
} else {
eventConsumer.acceptNestMethodBridge(targetMethod, bridgeMethod, context);
@@ -441,29 +441,35 @@
}
private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) {
- return syntheticNestConstructorTypes.get(constructor.getHolderType());
+ return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
}
DexClass ensureConstructorArgumentClass(DexClassAndMethod constructor) {
assert constructor.getDefinition().isInstanceInitializer();
+ assert constructor.isProgramMethod() || constructor.isClasspathMethod();
+ DexType hostType =
+ constructor.isProgramMethod()
+ ? constructor.asProgramMethod().getHolder().getNestHost()
+ : constructor.asClasspathMethod().getHolder().getNestHost();
+ DexClass host = appView.definitionFor(hostType);
return syntheticNestConstructorTypes.computeIfAbsent(
- constructor.getHolderType(),
+ hostType,
holder -> {
- if (constructor.isProgramMethod()) {
+ if (host.isProgramClass()) {
return appView
.getSyntheticItems()
.createFixedClass(
kinds -> kinds.INIT_TYPE_ARGUMENT,
- constructor.asProgramMethod().getHolder(),
+ host.asProgramClass(),
appView,
builder -> {});
} else {
- assert constructor.isClasspathMethod();
+ assert host.isClasspathClass();
return appView
.getSyntheticItems()
.ensureFixedClasspathClass(
kinds -> kinds.INIT_TYPE_ARGUMENT,
- constructor.asClasspathMethod().getHolder(),
+ host.asClasspathClass(),
appView,
ignored -> {},
ignored -> {});
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
index afbeedc..8ec49e2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@
package com.android.tools.r8.ir.desugar.nest;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
@@ -14,7 +14,7 @@
void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context);
void acceptNestFieldGetBridge(
@@ -46,7 +46,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
// Intentionally empty.
}
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
index b556923..3af5dc4 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -7,6 +7,7 @@
import static com.android.tools.r8.profile.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexClasspathClass;
import com.android.tools.r8.graph.DexMethod;
@@ -292,7 +293,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
nestBasedAccessDesugaringEventConsumer.acceptNestConstructorBridge(
target, bridge, argumentClass, context);
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
index 7d731fb..c44706f 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@
package com.android.tools.r8.profile.rewriting;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.nest.NestBasedAccessDesugaringEventConsumer;
@@ -38,12 +38,13 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexProgramClass argumentClass,
+ DexClass argumentClass,
DexClassAndMethod context) {
if (context.isProgramMethod()) {
additionsCollection.applyIfContextIsInProfile(
context.asProgramMethod(),
- additionsBuilder -> additionsBuilder.addRule(argumentClass).addRule(bridge));
+ additionsBuilder ->
+ additionsBuilder.addRule(argumentClass.getReference()).addRule(bridge));
} else {
additionsCollection.accept(
additions ->
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
index 0dec846..5e18f9c 100644
--- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -45,7 +45,7 @@
.inspect(
inspector ->
assertEquals(
- 5,
+ 1,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))
@@ -73,7 +73,7 @@
.inspect(
inspector ->
assertEquals(
- 1,
+ 0,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))
@@ -106,7 +106,7 @@
.inspect(
inspector ->
assertEquals(
- 5,
+ 1,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))
diff --git a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
index d2e3d0c..974683a 100644
--- a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
@@ -64,13 +64,13 @@
inner.inspect(
inspector -> {
assertThisNumberOfBridges(inspector, 3);
- assertNestConstructor(inspector);
+ assertNoNestConstructor(inspector);
});
D8TestCompileResult host = compileClassesWithD8ProgramClasses(nestHost, nestHost);
host.inspect(
inspector -> {
assertThisNumberOfBridges(inspector, 1);
- assertNestConstructor(inspector);
+ assertInitArgumentClass(inspector);
});
}
@@ -100,10 +100,14 @@
.compile();
}
- private static void assertNestConstructor(CodeInspector inspector) {
+ private static void assertInitArgumentClass(CodeInspector inspector) {
assertTrue(inspector.allClasses().stream().anyMatch(FoundClassSubject::isSynthetic));
}
+ private static void assertNoNestConstructor(CodeInspector inspector) {
+ assertTrue(inspector.allClasses().stream().noneMatch(FoundClassSubject::isSynthetic));
+ }
+
private static void assertThisNumberOfBridges(CodeInspector inspector, int numBridges) {
for (FoundClassSubject clazz : inspector.allClasses()) {
if (!clazz.isSynthetic()) {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
index 3c7248a..b2ea090 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
@@ -91,9 +91,9 @@
parameters.isCfRuntime(),
result ->
result.assertSuccessWithOutputLines(
- "Outer$Inner-IA, 1",
- "int, Outer$Inner-IA, 2",
- "int, int, Outer$Inner-IA, 3",
+ "Outer-IA, 1",
+ "int, Outer-IA, 2",
+ "int, int, Outer-IA, 3",
"int, int, 2",
"int, 1",
"0"),
@@ -102,9 +102,9 @@
"0",
"int, 1",
"int, int, 2",
- "int, int, Outer$Inner-IA, 3",
- "int, Outer$Inner-IA, 2",
- "Outer$Inner-IA, 1"));
+ "int, int, Outer-IA, 3",
+ "int, Outer-IA, 2",
+ "Outer-IA, 1"));
}
@Test
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
index 5756f2e..2b2d2f0 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
@@ -107,7 +107,6 @@
inspect(
profileInspector,
inspector,
- false,
parameters.canUseNestBasedAccessesWhenDesugaring(),
false);
}
@@ -117,7 +116,6 @@
inspect(
profileInspector,
inspector,
- parameters.canHaveNonReboundConstructorInvoke(),
parameters.canUseNestBasedAccesses(),
true);
}
@@ -125,7 +123,6 @@
private void inspect(
ArtProfileInspector profileInspector,
CodeInspector inspector,
- boolean canHaveNonReboundConstructorInvoke,
boolean canUseNestBasedAccesses,
boolean isR8)
throws Exception {
@@ -135,7 +132,7 @@
ClassSubject syntheticConstructorArgumentClassSubject =
inspector.clazz(
SyntheticItemsTestUtils.syntheticNestConstructorArgumentClass(
- Reference.classFromClass(NestMember.class)));
+ Reference.classFromClass(Main.class)));
assertThat(
syntheticConstructorArgumentClassSubject, notIf(isPresent(), canUseNestBasedAccesses));