Rewrite LambdaInstructionDesugaring to use DesugaringDescription
Fixes: b/270144537
Change-Id: I102b2906d13fdf667724121476f59e22593a5e32
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index bf17d33..a241940 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -110,6 +110,7 @@
eventConsumer,
ignore, // context
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
methodProvider.rewriteInvoke(
invoke, appView, eventConsumer, methodProcessingContext, localStackAllocator))
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
index bb900d3..7cff400b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
@@ -51,6 +51,7 @@
eventConsumer,
ignore, // context
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
ImmutableList.of(newInvoke, new CfCheckCast(invokedMethod.getReturnType())))
.build();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
index 0d454d6..f65d62c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
@@ -53,6 +53,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
index 79e6e04..ab7f14a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
@@ -38,6 +38,7 @@
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
+ CfInstructionDesugaringCollection desugaringCollection,
DexItemFactory dexItemFactory) {
return null;
}
@@ -64,6 +65,7 @@
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
+ CfInstructionDesugaringCollection desugaringCollection,
DexItemFactory dexItemFactory);
}
@@ -142,6 +144,7 @@
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
+ CfInstructionDesugaringCollection desugaringCollection,
DexItemFactory dexItemFactory) {
return desugarRewrite == null
? null
@@ -151,6 +154,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory);
}
};
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
index 7bef7e4..09e3186 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
@@ -42,6 +42,7 @@
eventConsumer,
ignore, // context
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
ImmutableList.of(new CfInvoke(Opcodes.INVOKESPECIAL, method, invoke.isInterface())))
.build();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java b/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
index 1b07110..b62d335 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
@@ -166,6 +166,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
report(context);
Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -215,6 +216,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
report(context);
Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -260,6 +262,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
report(context);
Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -299,6 +302,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
report(context);
Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -339,6 +343,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
report(context);
Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -388,6 +393,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
index 71ce242..e2a0c14 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -79,6 +79,7 @@
eventConsumer,
context1,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
desugarLibraryCall(
methodProcessingContext.createUniqueContext(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
index 70d6da1..0ee4ce0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
@@ -99,6 +99,7 @@
eventConsumer,
context1,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
desugarConstDynamicInstruction(
instruction.asConstDynamic(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
index 4079aa2..ff3989a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
@@ -75,6 +75,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
getThrowInstructions(
appView,
@@ -97,6 +98,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
getThrowInstructions(
appView,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
index 534ca0c..301802b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
@@ -63,6 +63,7 @@
eventConsumer,
ignore, // context
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
ImmutableList.of(
new CfInvoke(
@@ -79,6 +80,7 @@
eventConsumer,
ignore, // context
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
ImmutableList.of(
new CfInvoke(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 79e8185..ce4afdd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -424,6 +424,7 @@
eventConsumer,
context1,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
ProgramMethod newProgramMethod =
appView
@@ -472,6 +473,7 @@
eventConsumer,
context12,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
DexClassAndMethod companionMethod =
helper.ensureStaticAsMethodOfCompanionClassStub(method, eventConsumer);
@@ -517,6 +519,7 @@
eventConsumer,
context1,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
getInvokeStaticInstructions(
helper
@@ -563,6 +566,7 @@
eventConsumer,
context1,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
// This can be a private instance method call. Note that the referenced
// method is expected to be in the current class since it is private, but desugaring
@@ -602,6 +606,7 @@
eventConsumer,
context12,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
// This is a invoke-direct call to a virtual method.
DexClassAndMethod companionMethod =
@@ -718,6 +723,7 @@
eventConsumer,
context1,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
DexClassAndMethod method = resolutionResult.getResolutionPair();
DexMethod companionMethod;
@@ -740,6 +746,7 @@
eventConsumer,
context12,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
DexClassAndMethod method = resolutionResult.getResolutionPair();
// TODO(b/199135051): Why do this amend routine. We have done resolution, so would
@@ -800,6 +807,7 @@
eventConsumer,
context13,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
DexClassAndMethod companionTarget =
helper.ensureDefaultAsMethodOfCompanionClassStub(
@@ -826,6 +834,7 @@
eventConsumer,
context14,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
getInvokeStaticInstructions(
helper.ensureEmulatedInterfaceForwardingMethod(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index 532909b..8c625a7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -16,7 +16,6 @@
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexMethodHandle;
import com.android.tools.r8.graph.DexProgramClass;
@@ -24,8 +23,8 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaring;
-import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
+import com.android.tools.r8.ir.desugar.DesugarDescription;
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LambdaClass;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
@@ -68,33 +67,36 @@
}
@Override
- public Collection<CfInstruction> desugarInstruction(
- CfInstruction instruction,
- FreshLocalProvider freshLocalProvider,
- LocalStackAllocator localStackAllocator,
- CfInstructionDesugaringEventConsumer eventConsumer,
- ProgramMethod context,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringCollection desugaringCollection,
- DexItemFactory dexItemFactory) {
- if (instruction.isInvokeDynamic()) {
- return desugarInvokeDynamicInstruction(
- instruction.asInvokeDynamic(),
- freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- context,
- methodProcessingContext,
- (invoke, localProvider, stackAllocator) ->
- desugaringCollection.desugarInstruction(
- invoke,
- localProvider,
- stackAllocator,
- eventConsumer,
- context,
- methodProcessingContext));
+ public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
+ if (!isLambdaInvoke(instruction, context, appView)) {
+ return DesugarDescription.nothing();
}
- return null;
+
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ ignore, // context
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) ->
+ desugarInvokeDynamicInstruction(
+ instruction.asInvokeDynamic(),
+ freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext,
+ (invoke, localProvider, stackAllocator) ->
+ desugaringCollection.desugarInstruction(
+ invoke,
+ localProvider,
+ stackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext)))
+ .build();
}
public interface DesugarInvoke {
@@ -181,11 +183,6 @@
return lambdaClass;
}
- @Override
- public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
- return isLambdaInvoke(instruction, context, appView);
- }
-
public static boolean isLambdaInvoke(
CfInstruction instruction, ProgramMethod context, AppView<?> appView) {
return instruction.isInvokeDynamic()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
index b95fd85..726ce09 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
@@ -95,6 +95,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
desugarMakeConcatInstructions(invoke, freshLocalProvider, localStackAllocator))
.build();
@@ -130,6 +131,7 @@
eventConsumer,
ignore, // context
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
desugarMakeConcatWithConstantsInstructions(
invoke, freshLocalProvider, localStackAllocator, context))
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
index 6f2b1a6..2fbf5d3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
@@ -73,6 +73,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
createAndCallSyntheticMethod(
kinds -> kinds.BACKPORT,
@@ -96,6 +97,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
createAndCallSyntheticMethod(
kinds -> kinds.BACKPORT,
@@ -116,6 +118,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) ->
createAndCallSyntheticMethod(
kinds -> kinds.TWR_CLOSE_RESOURCE,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
index 7d4234a..80f114f4 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
@@ -301,6 +301,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
ensureMethodHandlesLookupClass(eventConsumer, context);
localStackAllocator.allocateLocalStack(2);
@@ -326,6 +327,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
ensureMethodHandlesLookupClass(eventConsumer, context);
// Rewrite MethodHandles.privateLookupIn(class, lookup) to
@@ -351,6 +353,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
localStackAllocator.allocateLocalStack(2);
return ImmutableList.of(
@@ -377,6 +380,7 @@
eventConsumer,
context,
methodProcessingContext,
+ desugaringCollection,
dexItemFactory) -> {
ensureVarHandleClass(eventConsumer, context);
return desugarSignaturePolymorphicMethod(