Nest constructor bridge arg removal
- fixed assertion in LensCodeRewriter for nest constructor
and arg removal
- fixed assertion in R8 when no minification/no treeshaking/
no applymapping
- extend test for Nest constructor bridge and arg removal
(existing test was not performing as intended)
Bug: 142042549
Change-Id: Iedd4a422ccc994968993cf9df1d00505835a68f3
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 91b6ab7..a7d57b1 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -765,7 +765,11 @@
// Validity checks.
assert application.classes().stream().allMatch(clazz -> clazz.isValid(options));
- assert appView.rootSet().verifyKeptItemsAreKept(application, appView.appInfo());
+ if (options.isShrinking()
+ || options.isMinifying()
+ || options.getProguardConfiguration().hasApplyMappingFile()) {
+ assert appView.rootSet().verifyKeptItemsAreKept(application, appView.appInfo());
+ }
assert appView
.graphLense()
.verifyMappingToOriginalProgram(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 229f3a6..ef5da18 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -241,8 +241,6 @@
newInValues.add(invoke.inValues().get(i));
}
}
- assert newInValues.size()
- == actualTarget.proto.parameters.size() + (actualInvokeType == STATIC ? 0 : 1);
} else {
newInValues = invoke.inValues();
}
@@ -254,6 +252,9 @@
newInValues.add(extraNullValue);
}
+ assert newInValues.size()
+ == actualTarget.proto.parameters.size() + (actualInvokeType == STATIC ? 0 : 1);
+
Invoke newInvoke =
Invoke.create(actualInvokeType, actualTarget, null, newOutValue, newInValues);
iterator.replaceCurrentInstruction(newInvoke);
diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java b/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
index f3ee216..1326c8f 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
+++ b/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
@@ -28,8 +28,12 @@
this.field = field;
}
- private BasicNestedClass(String unused, String field, String alsoUnused) {
- this.field = field + "UnusedConstructor";
+ private BasicNestedClass(Object unused, Object field, Object alsoUnused) {
+ this.field = field.toString() + "UnusedConstructor";
+ }
+
+ private BasicNestedClass(UnInstantiatedClass instance, UnInstantiatedClass otherInstance) {
+ this.field = "nothing";
}
public static BasicNestHostWithInnerClassConstructors createOuterInstance(String field) {
@@ -37,6 +41,8 @@
}
}
+ public static class UnInstantiatedClass {}
+
public static void main(String[] args) {
BasicNestHostWithInnerClassConstructors outer = BasicNestedClass.createOuterInstance("field");
BasicNestedClass inner =
@@ -44,11 +50,13 @@
BasicNestHostWithInnerClassConstructors noBridge =
new BasicNestHostWithInnerClassConstructors(1);
BasicNestedClass unusedParamConstructor =
- new BasicNestedClass("unused", "innerField", "alsoUnused");
+ new BasicNestedClass(new Object(), "innerField", new Object());
+ BasicNestedClass uninstantiatedParamConstructor = new BasicNestedClass(null, null);
System.out.println(outer.field);
System.out.println(inner.field);
System.out.println(noBridge.field);
System.out.println(unusedParamConstructor.field);
+ System.out.println(uninstantiatedParamConstructor.field);
}
}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
index 2838b43..a9fcd68 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
@@ -33,6 +33,7 @@
"BasicNestHostWithInnerClassMethods$BasicNestedClass",
"BasicNestHostWithInnerClassConstructors",
"BasicNestHostWithInnerClassConstructors$BasicNestedClass",
+ "BasicNestHostWithInnerClassConstructors$UnInstantiatedClass",
"BasicNestHostWithAnonymousInnerClass",
"BasicNestHostWithAnonymousInnerClass$1",
"BasicNestHostWithAnonymousInnerClass$InterfaceForAnonymousClass",
@@ -128,7 +129,8 @@
"hostMethodstaticHostMethodstaticNestMethod"))
.put(
"constructors",
- StringUtils.lines("field", "nest1SField", "1", "innerFieldUnusedConstructor"))
+ StringUtils.lines(
+ "field", "nest1SField", "1", "innerFieldUnusedConstructor", "nothing"))
.put(
"anonymous",
StringUtils.lines(
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java
new file mode 100644
index 0000000..1ed0e0a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java
@@ -0,0 +1,74 @@
+// Copyright (c) 2019, 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.desugar.nestaccesscontrol;
+
+import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.classesOfNest;
+import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.getExpectedResult;
+import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.getMainClass;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper.DexVm;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class NestConstructorRemovedArgTest extends TestBase {
+
+ public NestConstructorRemovedArgTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters()
+ .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
+ .withDexRuntime(DexVm.Version.first())
+ .withDexRuntime(DexVm.Version.last())
+ .withAllApiLevels()
+ .build();
+ }
+
+ @Test
+ public void testRemoveArgConstructorNestsR8() throws Exception {
+ String nestID = "constructors";
+ testForR8(parameters.getBackend())
+ .addKeepMainRule(getMainClass(nestID))
+ .noMinification()
+ .setMinApi(parameters.getApiLevel())
+ .addOptionsModification(
+ options -> {
+ options.enableClassInlining = false;
+ })
+ .addProgramFiles(classesOfNest(nestID))
+ .compile()
+ .run(parameters.getRuntime(), getMainClass(nestID))
+ .assertSuccessWithOutput(getExpectedResult(nestID));
+ }
+
+ @Test
+ public void testRemoveArgConstructorNestsR8NoTreeShaking() throws Exception {
+ String nestID = "constructors";
+ testForR8(parameters.getBackend())
+ .noTreeShaking()
+ .addKeepMainRule(getMainClass(nestID))
+ .noMinification()
+ .setMinApi(parameters.getApiLevel())
+ .addOptionsModification(
+ options -> {
+ options.enableClassInlining = false;
+ })
+ .addProgramFiles(classesOfNest(nestID))
+ .compile()
+ .run(parameters.getRuntime(), getMainClass(nestID))
+ .assertSuccessWithOutput(getExpectedResult(nestID));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java
index 0f89cbb..bb59533 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java
@@ -73,7 +73,7 @@
containsString("BasicNestHostWithInnerClassConstructors$BasicNestedClass"));
inner.inspect(
inspector -> {
- assertThisNumberOfBridges(inspector, 2);
+ assertThisNumberOfBridges(inspector, 3);
assertNestConstructor(inspector);
});
D8TestCompileResult host =