diff options
author | Clément Béra <clementbera@google.com> | 2021-03-22 09:14:42 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-03-22 09:14:42 +0000 |
commit | 99fe3a106ce68ae7a770aab5d54b8813cc8418ec (patch) | |
tree | 729b908b0b0abba95e155afb4a27f0f6f0c409be | |
parent | a80b92c0950dce55f1e7006e46249aea4402440e (diff) | |
parent | e56a240cabdd531eb8c0f0e2dc24f12174ac0192 (diff) | |
download | r8-99fe3a106ce68ae7a770aab5d54b8813cc8418ec.tar.gz |
Fix maxLocals bug with ForwardMethodBuilder am: e56a240cab
Original change: undetermined
Change-Id: I434f4a08f6ab729610346a59b716db8de0115ea5
8 files changed, 34 insertions, 20 deletions
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java index 0c6b359a9..48536cc8d 100644 --- a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java +++ b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java @@ -171,15 +171,17 @@ public class ForwardMethodBuilder { maxLocals += 1; } DexType[] sourceParameters = getSourceParameters(); - for (int i = 0; - i < sourceParameters.length - BooleanUtils.intValue(sourceMethodHasExtraUnusedParameter); - i++) { + for (int i = 0; i < sourceParameters.length; i++) { DexType parameter = sourceParameters[i]; ValueType parameterType = ValueType.fromDexType(parameter); - instructions.add(new CfLoad(parameterType, maxLocals)); + if (!(sourceMethodHasExtraUnusedParameter && i == sourceParameters.length - 1)) { + // We do not need to load the last parameter if it is unused. + // We still need to increase the maxStack/maxLocals values for the method to verify. + instructions.add(new CfLoad(parameterType, maxLocals)); + maybeInsertArgumentCast(i, parameter, instructions); + } maxStack += parameterType.requiredRegisters(); maxLocals += parameterType.requiredRegisters(); - maybeInsertArgumentCast(i, parameter, instructions); } instructions.add(new CfInvoke(getInvokeOpcode(), targetMethod, isInterface)); if (!targetMethod.getReturnType().isVoidType()) { diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java index 68f3fcfe9..58cf4989b 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java @@ -32,7 +32,6 @@ import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.google.common.collect.ImmutableList; import java.util.function.BiFunction; import java.util.function.Function; -import org.junit.Assume; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -54,6 +53,7 @@ public class FullNestOnProgramPathTest extends TestBase { .withCfRuntimesStartingFromIncluding(CfVm.JDK11) .withDexRuntimes() .withApiLevelsStartingAtIncluding(apiLevelWithInvokeCustomSupport()) + .enableApiLevelsForCf() .build(); } @@ -120,9 +120,8 @@ public class FullNestOnProgramPathTest extends TestBase { @Test public void testSingleNestD8() throws Exception { - Assume.assumeTrue(parameters.isDexRuntime()); for (String nestID : NEST_IDS) { - testForD8() + testForD8(parameters.getBackend()) .setMinApi(parameters.getApiLevel()) .addProgramFiles(classesOfNest(nestID)) .compile() diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java index 47320d8ed..ffaca184e 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java @@ -42,6 +42,7 @@ public class MinimumNumberOfBridgesGenerated extends TestBase { .withDexRuntime(DexVm.Version.first()) .withDexRuntime(DexVm.Version.last()) .withApiLevelsStartingAtIncluding(apiLevelWithInvokeCustomSupport()) + .enableApiLevelsForCf() .build(); } diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java index 2abe13357..00575cd60 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java @@ -43,7 +43,10 @@ public class NestAttributesUpdateTest extends TestBase { @Parameters(name = "{0}") public static TestParametersCollection data() { - return getTestParameters().withCfRuntimesStartingFromIncluding(CfVm.JDK11).build(); + return getTestParameters() + .withCfRuntimesStartingFromIncluding(CfVm.JDK11) + .withAllApiLevelsAlsoForCf() + .build(); } @Test diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestClassMergingTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestClassMergingTest.java index 9f41a1739..3e8fc2a81 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestClassMergingTest.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestClassMergingTest.java @@ -44,6 +44,7 @@ public class NestClassMergingTest extends TestBase { public static TestParametersCollection data() { return getTestParameters() .withCfRuntimesStartingFromIncluding(CfVm.JDK11) + .withAllApiLevelsAlsoForCf() .build(); } diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestCompilationExceptionTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestCompilationExceptionTest.java index fd874a14a..2533da9f3 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestCompilationExceptionTest.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestCompilationExceptionTest.java @@ -32,7 +32,6 @@ import com.android.tools.r8.references.Reference; import java.nio.file.Path; import java.util.List; import org.hamcrest.Matcher; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -54,12 +53,12 @@ public class NestCompilationExceptionTest extends TestBase { .withDexRuntime(DexVm.Version.first()) .withDexRuntime(DexVm.Version.last()) .withApiLevelsStartingAtIncluding(apiLevelWithInvokeCustomSupport()) + .enableApiLevelsForCf() .build(); } @Test public void testD8() throws Exception { - Assume.assumeTrue(parameters.isDexRuntime()); testMissingNestHostError(true); testIncompleteNestError(true); } @@ -87,7 +86,9 @@ public class NestCompilationExceptionTest extends TestBase { .map(name -> CLASSES_PATH.resolve(name + CLASS_EXTENSION)) .collect(toList()); if (d8) { - return testForD8().setMinApi(parameters.getApiLevel()).addProgramFiles(matchingClasses); + return testForD8(parameters.getBackend()) + .setMinApi(parameters.getApiLevel()) + .addProgramFiles(matchingClasses); } else { return testForR8(parameters.getBackend()) .noTreeShaking() @@ -109,10 +110,11 @@ public class NestCompilationExceptionTest extends TestBase { .compileWithExpectedDiagnostics( diagnostics -> { if (d8) { - diagnostics - .assertOnlyErrors() - .assertErrorsMatch( - diagnosticType(MissingNestHostNestDesugarDiagnostic.class)); + if (parameters.getBackend().isDex()) { + diagnostics.assertOnlyErrors(); + } + diagnostics.assertErrorsMatch( + diagnosticType(MissingNestHostNestDesugarDiagnostic.class)); MissingNestHostNestDesugarDiagnostic diagnostic = (MissingNestHostNestDesugarDiagnostic) diagnostics.getErrors().get(0); @@ -148,9 +150,11 @@ public class NestCompilationExceptionTest extends TestBase { .compileWithExpectedDiagnostics( diagnostics -> { if (d8) { - diagnostics - .assertOnlyErrors() - .assertErrorsMatch(diagnosticType(IncompleteNestNestDesugarDiagnosic.class)); + if (parameters.getBackend().isDex()) { + diagnostics.assertOnlyErrors(); + } + diagnostics.assertErrorsMatch( + diagnosticType(IncompleteNestNestDesugarDiagnosic.class)); IncompleteNestNestDesugarDiagnosic diagnostic = (IncompleteNestNestDesugarDiagnosic) diagnostics.getErrors().get(0); 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 index b216639ed..04eac5e8a 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java @@ -35,6 +35,7 @@ public class NestConstructorRemovedArgTest extends TestBase { .withDexRuntime(DexVm.Version.first()) .withDexRuntime(DexVm.Version.last()) .withApiLevelsStartingAtIncluding(apiLevelWithInvokeCustomSupport()) + .enableApiLevelsForCf() .build(); } diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java index 373f6fc34..726f39174 100644 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java +++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java @@ -36,7 +36,10 @@ public class NestMethodInlinedTest extends TestBase { @Parameters(name = "{0}") public static TestParametersCollection data() { - return getTestParameters().withCfRuntimesStartingFromIncluding(CfVm.JDK11).build(); + return getTestParameters() + .withCfRuntimesStartingFromIncluding(CfVm.JDK11) + .withAllApiLevelsAlsoForCf() + .build(); } @Test |