Revert "Fix lambda desugaring using nest based access" This reverts commit 44653ffdc517ce276e39d4e9a3dc3a9b3593a554. Reason for revert: Breaking multiple test (Regress191296688, AppDeterminismTest) Change-Id: Ib8e85782406e315e66ecac6b683291eced1851d5
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java index e348356..ac5addd 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -690,8 +690,6 @@ assert !appView.options().isGeneratingClassFiles() || replacement.getCode().isCfCode(); assert !appView.options().isGeneratingDex() || replacement.getCode().isDexCode(); ProgramMethod newMethod = new ProgramMethod(implMethodHolder, replacement); - // TODO(b/236937595): Investigate why processing is needed here only in desugared library - // compilation. if (appView.options().isDesugaredLibraryCompilation()) { assert appView.options().isGeneratingClassFiles(); needsProcessingConsumer.accept(newMethod); @@ -780,8 +778,6 @@ assert !appView.options().isGeneratingClassFiles() || replacement.getCode().isCfCode(); assert !appView.options().isGeneratingDex() || replacement.getCode().isDexCode(); ProgramMethod newMethod = new ProgramMethod(implMethodHolder, replacement); - // TODO(b/236937595): Investigate why processing is needed here only in desugared library - // compilation. if (appView.options().isDesugaredLibraryCompilation()) { assert appView.options().isGeneratingClassFiles(); needsProcessingConsumer.accept(newMethod); @@ -850,7 +846,10 @@ .disableAndroidApiLevelCheck() .build()); accessorClass.addDirectMethod(accessorMethod.getDefinition()); - needsProcessingConsumer.accept(accessorMethod); + if (appView.options().isDesugaredLibraryCompilation() + || appView.options().isGeneratingDex()) { + needsProcessingConsumer.accept(accessorMethod); + } return accessorMethod; } }
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 37451f0..4da9973 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
@@ -10,7 +10,6 @@ import com.android.tools.r8.cf.code.CfFieldInstruction; import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.cf.code.CfInvokeDynamic; import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; @@ -35,7 +34,6 @@ import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection; import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer; import com.android.tools.r8.ir.desugar.FreshLocalProvider; -import com.android.tools.r8.ir.desugar.LambdaDescriptor; import com.android.tools.r8.ir.desugar.LocalStackAllocator; import com.android.tools.r8.ir.desugar.ProgramAdditions; import com.android.tools.r8.utils.BooleanUtils; @@ -148,20 +146,6 @@ if (needsDesugaring(invokedMethod, method)) { prepareDesugarMethodInstruction(invokedMethod, method, programAdditions); } - } else if (instruction.isInvokeDynamic()) { - // Starting from Java 17, lambda can use nest based access. We need to generate - // bridges for the targeted lambda method. - CfInvokeDynamic cfInvokeDynamic = instruction.asInvokeDynamic(); - LambdaDescriptor lambdaDescriptor = - LambdaDescriptor.tryInfer( - cfInvokeDynamic.getCallSite(), appView.appInfoForDesugaring(), method); - if (lambdaDescriptor != null) { - DexMember<?, ?> member = lambdaDescriptor.implHandle.member; - if (needsDesugaring(member, method)) { - assert member.isDexMethod(); - prepareDesugarMethodInstruction(member.asDexMethod(), method, programAdditions); - } - } } }); }
diff --git a/src/test/examplesJava17/nest/NestLambda.java b/src/test/examplesJava17/nest/NestLambda.java deleted file mode 100644 index 2c690b5..0000000 --- a/src/test/examplesJava17/nest/NestLambda.java +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright (c) 2022, 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 nest; - -import java.util.function.Consumer; - -public class NestLambda { - - private void print(Object o) { - System.out.println("printed: " + o); - } - - Inner getInner() { - return new Inner(); - } - - class Inner { - - void exec(Consumer<Object> consumer) { - consumer.accept("inner"); - } - - void execLambda() { - exec(NestLambda.this::print); - } - } - - public static void main(String[] args) { - new NestLambda().getInner().execLambda(); - } -}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestLambdaJava17Test.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestLambdaJava17Test.java deleted file mode 100644 index 94fbe71..0000000 --- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestLambdaJava17Test.java +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright (c) 2022, 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.utils.AndroidApiLevel.B; -import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION; - -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; -import com.android.tools.r8.ToolHelper.DexVm.Version; -import com.android.tools.r8.utils.AndroidApiLevel; -import java.nio.file.Path; -import java.nio.file.Paths; -import org.junit.Assume; -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 NestLambdaJava17Test extends TestBase { - - public NestLambdaJava17Test(TestParameters parameters) { - this.parameters = parameters; - } - - private static final Path JDK17_JAR = - Paths.get(ToolHelper.TESTS_BUILD_DIR, "examplesJava17").resolve("nest" + JAR_EXTENSION); - private static final String MAIN = "nest.NestLambda"; - private static final String EXPECTED_RESULT = "printed: inner"; - - private final TestParameters parameters; - - @Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters() - .withCfRuntimesStartingFromIncluding(CfVm.JDK17) - // The test requires the java.util.function. package. - .withDexRuntimesStartingFromIncluding(Version.V7_0_0) - .withApiLevel(AndroidApiLevel.N) - .enableApiLevelsForCf() - .build(); - } - - @Test - public void testReference() throws Exception { - Assume.assumeTrue(parameters.isCfRuntime()); - testForJvm() - .addProgramFiles(JDK17_JAR) - .run(parameters.getRuntime(), MAIN) - .assertSuccessWithOutputLines(EXPECTED_RESULT); - } - - @Test - public void testJavaD8() throws Exception { - testForDesugaring(parameters) - .addProgramFiles(JDK17_JAR) - .run(parameters.getRuntime(), MAIN) - .assertSuccessWithOutputLines(EXPECTED_RESULT); - } - - @Test - public void testR8() throws Exception { - Assume.assumeTrue(parameters.isDexRuntime() || parameters.getApiLevel().equals(B)); - testForR8(parameters.getBackend()) - .addProgramFiles(JDK17_JAR) - .applyIf( - parameters.isCfRuntime(), - // Alternatively we need to pass Jdk17 as library. - b -> b.addKeepRules("-dontwarn java.lang.invoke.StringConcatFactory")) - .setMinApi(parameters.getApiLevel()) - .addKeepMainRule(MAIN) - .run(parameters.getRuntime(), MAIN) - .assertSuccessWithOutputLines(EXPECTED_RESULT); - } -}