Revert "Only create -IA classes for nest host and use that for members as well"
This reverts commit 4a887e66d44e9fadcb27fc616d64610440a4ecf1.
Reason for revert: this is breaking cts test in platform, with the class now being duplicated between different targets that we assert does not contain overlapping classes, see:
https://android-build.corp.google.com/test_investigate/invocation/I17100010309277229/test/TR24629417746288662/?blocking=blocking&status=none
Bug: b/359546659
Change-Id: Ie305379938afa72bf6b1dacb7a766e6eb4af8c7f
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 fcd5428..fb052fb 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,7 +6,6 @@
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;
@@ -289,7 +288,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexClass argumentClass,
+ DexProgramClass argumentClass,
DexClassAndMethod context) {
// Intentionally empty.
}
@@ -723,7 +722,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexClass argumentClass,
+ DexProgramClass 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 93b2f34..a4465a9 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,6 +13,7 @@
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;
@@ -108,7 +109,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexClass argumentClass,
+ DexProgramClass argumentClass,
DexClassAndMethod context) {
methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
}
@@ -228,7 +229,8 @@
private void ensureConstructorBridgeFromClasspathAccess(
ProgramMethod method, NestBasedAccessDesugaringEventConsumer eventConsumer) {
assert method.getDefinition().isInstanceInitializer();
- DexClass constructorArgumentClass = ensureConstructorArgumentClass(method);
+ DexProgramClass constructorArgumentClass =
+ ensureConstructorArgumentClass(method).asProgramClass();
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 55221e7..10f3501 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()) {
- DexClass argumentClass = getConstructorArgumentClass(targetMethod);
+ DexProgramClass argumentClass = getConstructorArgumentClass(targetMethod).asProgramClass();
eventConsumer.acceptNestConstructorBridge(targetMethod, bridgeMethod, argumentClass, context);
} else {
eventConsumer.acceptNestMethodBridge(targetMethod, bridgeMethod, context);
@@ -441,35 +441,29 @@
}
private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) {
- return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
+ return syntheticNestConstructorTypes.get(constructor.getHolderType());
}
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(
- hostType,
+ constructor.getHolderType(),
holder -> {
- if (host.isProgramClass()) {
+ if (constructor.isProgramMethod()) {
return appView
.getSyntheticItems()
.createFixedClass(
kinds -> kinds.INIT_TYPE_ARGUMENT,
- host.asProgramClass(),
+ constructor.asProgramMethod().getHolder(),
appView,
builder -> {});
} else {
- assert host.isClasspathClass();
+ assert constructor.isClasspathMethod();
return appView
.getSyntheticItems()
.ensureFixedClasspathClass(
kinds -> kinds.INIT_TYPE_ARGUMENT,
- host.asClasspathClass(),
+ constructor.asClasspathMethod().getHolder(),
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 8ec49e2..afbeedc 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,
- DexClass argumentClass,
+ DexProgramClass argumentClass,
DexClassAndMethod context);
void acceptNestFieldGetBridge(
@@ -46,7 +46,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexClass argumentClass,
+ DexProgramClass 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 3af5dc4..b556923 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,7 +7,6 @@
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;
@@ -293,7 +292,7 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexClass argumentClass,
+ DexProgramClass 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 c44706f..7d731fb 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,13 +38,12 @@
public void acceptNestConstructorBridge(
ProgramMethod target,
ProgramMethod bridge,
- DexClass argumentClass,
+ DexProgramClass argumentClass,
DexClassAndMethod context) {
if (context.isProgramMethod()) {
additionsCollection.applyIfContextIsInProfile(
context.asProgramMethod(),
- additionsBuilder ->
- additionsBuilder.addRule(argumentClass.getReference()).addRule(bridge));
+ additionsBuilder -> additionsBuilder.addRule(argumentClass).addRule(bridge));
} else {
additionsCollection.accept(
additions ->
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
index 5e18f9c..0dec846 100644
--- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -45,7 +45,7 @@
.inspect(
inspector ->
assertEquals(
- 1,
+ 5,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))
@@ -73,7 +73,7 @@
.inspect(
inspector ->
assertEquals(
- 0,
+ 1,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))
@@ -106,7 +106,7 @@
.inspect(
inspector ->
assertEquals(
- 1,
+ 5,
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 974683a..d2e3d0c 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);
- assertNoNestConstructor(inspector);
+ assertNestConstructor(inspector);
});
D8TestCompileResult host = compileClassesWithD8ProgramClasses(nestHost, nestHost);
host.inspect(
inspector -> {
assertThisNumberOfBridges(inspector, 1);
- assertInitArgumentClass(inspector);
+ assertNestConstructor(inspector);
});
}
@@ -100,14 +100,10 @@
.compile();
}
- private static void assertInitArgumentClass(CodeInspector inspector) {
+ private static void assertNestConstructor(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 b2ea090..3c7248a 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-IA, 1",
- "int, Outer-IA, 2",
- "int, int, Outer-IA, 3",
+ "Outer$Inner-IA, 1",
+ "int, Outer$Inner-IA, 2",
+ "int, int, Outer$Inner-IA, 3",
"int, int, 2",
"int, 1",
"0"),
@@ -102,9 +102,9 @@
"0",
"int, 1",
"int, int, 2",
- "int, int, Outer-IA, 3",
- "int, Outer-IA, 2",
- "Outer-IA, 1"));
+ "int, int, Outer$Inner-IA, 3",
+ "int, Outer$Inner-IA, 2",
+ "Outer$Inner-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 2b2d2f0..5756f2e 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,6 +107,7 @@
inspect(
profileInspector,
inspector,
+ false,
parameters.canUseNestBasedAccessesWhenDesugaring(),
false);
}
@@ -116,6 +117,7 @@
inspect(
profileInspector,
inspector,
+ parameters.canHaveNonReboundConstructorInvoke(),
parameters.canUseNestBasedAccesses(),
true);
}
@@ -123,6 +125,7 @@
private void inspect(
ArtProfileInspector profileInspector,
CodeInspector inspector,
+ boolean canHaveNonReboundConstructorInvoke,
boolean canUseNestBasedAccesses,
boolean isR8)
throws Exception {
@@ -132,7 +135,7 @@
ClassSubject syntheticConstructorArgumentClassSubject =
inspector.clazz(
SyntheticItemsTestUtils.syntheticNestConstructorArgumentClass(
- Reference.classFromClass(Main.class)));
+ Reference.classFromClass(NestMember.class)));
assertThat(
syntheticConstructorArgumentClassSubject, notIf(isPresent(), canUseNestBasedAccesses));