Always use context from the closure invocation for desugaring
This is just to avoid renaming the context parameter name for the closure.
Bug: b/270021543
Change-Id: I7fb6e474609a44d119ebf41af660f926770c50d5
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 a241940..508c314 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
@@ -103,12 +103,16 @@
.isSyntheticOfKind(context.getContextType(), kinds -> kinds.BACKPORT_WITH_FORWARDING)) {
return DesugarDescription.nothing();
}
+ return desugarInstruction(invoke, methodProvider);
+ }
+
+ private DesugarDescription desugarInstruction(CfInvoke invoke, MethodProvider methodProvider) {
return DesugarDescription.builder()
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
eventConsumer,
- ignore, // context
+ context,
methodProcessingContext,
desugaringCollection,
dexItemFactory) ->
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 7cff400b..3f80a47 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
@@ -44,12 +44,16 @@
CfInvoke newInvoke =
new CfInvoke(
cfInvoke.getOpcode(), invokedMethod.withProto(proto, factory), cfInvoke.isInterface());
+ return desugarInstruction(invokedMethod, newInvoke);
+ }
+
+ private DesugarDescription desugarInstruction(DexMethod invokedMethod, CfInvoke newInvoke) {
return DesugarDescription.builder()
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
eventConsumer,
- ignore, // context
+ 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 09e3186..ddc3f35 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
@@ -35,12 +35,16 @@
if (privateMethod == null) {
return DesugarDescription.nothing();
}
+ return desugarInstruction(invoke, method);
+ }
+
+ private DesugarDescription desugarInstruction(CfInvoke invoke, DexMethod method) {
return DesugarDescription.builder()
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
eventConsumer,
- ignore, // context
+ context,
methodProcessingContext,
desugaringCollection,
dexItemFactory) ->
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 301802b..9a8ba77 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
@@ -56,29 +56,36 @@
if (method.getAccessFlags().isFinal()) {
// This method is final thus we can use invoke-virtual.
- return DesugarDescription.builder()
- .setDesugarRewrite(
- (freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- ignore, // context
- methodProcessingContext,
- desugaringCollection,
- dexItemFactory) ->
- ImmutableList.of(
- new CfInvoke(
- Opcodes.INVOKEVIRTUAL, invoke.getMethod(), invoke.isInterface())))
- .build();
+ return desugarToInvokeVirtual(invoke);
}
// This is an invoke-special to a virtual method on invoke-special method holder.
// The invoke should be rewritten with a bridge.
+ return desugarWithBridge(invoke, method);
+ }
+
+ private DesugarDescription desugarToInvokeVirtual(CfInvoke invoke) {
return DesugarDescription.builder()
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
eventConsumer,
- ignore, // context
+ context,
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) ->
+ ImmutableList.of(
+ new CfInvoke(Opcodes.INVOKEVIRTUAL, invoke.getMethod(), invoke.isInterface())))
+ .build();
+ }
+
+ private DesugarDescription desugarWithBridge(CfInvoke invoke, ProgramMethod method) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
methodProcessingContext,
desugaringCollection,
dexItemFactory) ->
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 8c625a7..c33361a 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
@@ -71,13 +71,16 @@
if (!isLambdaInvoke(instruction, context, appView)) {
return DesugarDescription.nothing();
}
+ return desugarInstruction(instruction);
+ }
+ private DesugarDescription desugarInstruction(CfInstruction instruction) {
return DesugarDescription.builder()
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
eventConsumer,
- ignore, // context
+ context,
methodProcessingContext,
desugaringCollection,
dexItemFactory) ->
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 27d7c36..e5cb38c 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
@@ -33,13 +33,11 @@
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.DesugarDescription;
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;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -313,34 +311,14 @@
public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
if (instruction.isFieldInstruction()) {
if (needsDesugaring(instruction.asFieldInstruction().getField(), context)) {
- return DesugarDescription.builder()
- .setDesugarRewrite(
- (freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- ignore, // context
- methodProcessingContext,
- desugaringCollection,
- dexItemFactory) ->
- desugarFieldInstruction(instruction.asFieldInstruction(), context))
- .build();
+ return desugarFieldInstruction(instruction.asFieldInstruction());
} else {
return DesugarDescription.nothing();
}
}
if (instruction.isInvoke()) {
if (needsDesugaring(instruction.asInvoke().getMethod(), context)) {
- return DesugarDescription.builder()
- .setDesugarRewrite(
- (freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- ignore, // context
- methodProcessingContext,
- desugaringCollection,
- dexItemFactory) ->
- desugarInvokeInstruction(instruction.asInvoke(), localStackAllocator, context))
- .build();
+ return desugarInvokeInstruction(instruction.asInvoke());
} else {
return DesugarDescription.nothing();
}
@@ -348,47 +326,72 @@
return DesugarDescription.nothing();
}
- private List<CfInstruction> desugarFieldInstruction(
- CfFieldInstruction instruction, ProgramMethod context) {
- BridgeAndTarget<DexClassAndField> bridgeAndTarget =
- bridgeAndTargetForDesugaring(instruction.getField(), instruction.isFieldGet(), context);
- if (bridgeAndTarget == null) {
- return null;
- }
- // All bridges for program fields must have been added through the prepare step.
- assert !bridgeAndTarget.getTarget().isProgramField()
- || bridgeAndTarget.getTarget().getHolder().lookupDirectMethod(bridgeAndTarget.getBridge())
- != null;
- return ImmutableList.of(
- new CfInvoke(
- Opcodes.INVOKESTATIC,
- bridgeAndTarget.getBridge(),
- bridgeAndTarget.getTarget().getHolder().isInterface()));
+ private DesugarDescription desugarFieldInstruction(CfFieldInstruction instruction) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) -> {
+ BridgeAndTarget<DexClassAndField> bridgeAndTarget =
+ bridgeAndTargetForDesugaring(
+ instruction.getField(), instruction.isFieldGet(), context);
+ assert bridgeAndTarget != null;
+ // All bridges for program fields must have been added through the prepare step.
+ assert !bridgeAndTarget.getTarget().isProgramField()
+ || bridgeAndTarget
+ .getTarget()
+ .getHolder()
+ .lookupDirectMethod(bridgeAndTarget.getBridge())
+ != null;
+ return ImmutableList.of(
+ new CfInvoke(
+ Opcodes.INVOKESTATIC,
+ bridgeAndTarget.getBridge(),
+ bridgeAndTarget.getTarget().getHolder().isInterface()));
+ })
+ .build();
}
- private List<CfInstruction> desugarInvokeInstruction(
- CfInvoke invoke, LocalStackAllocator localStackAllocator, ProgramMethod context) {
- DexMethod invokedMethod = invoke.getMethod();
- BridgeAndTarget<DexClassAndMethod> bridgeAndTarget =
- bridgeAndTargetForDesugaring(invokedMethod, context, this::getConstructorArgumentClass);
- if (bridgeAndTarget == null) {
- return null;
- }
- // All bridges for program methods must have been added through the prepare step.
- assert !bridgeAndTarget.getTarget().isProgramMethod()
- || bridgeAndTarget.getTarget().getHolder().lookupDirectMethod(bridgeAndTarget.getBridge())
- != null;
- if (bridgeAndTarget.getTarget().getDefinition().isInstanceInitializer()) {
- assert !invoke.isInterface();
- // Ensure room on the stack for the extra null argument.
- localStackAllocator.allocateLocalStack(1);
- return ImmutableList.of(
- new CfConstNull(),
- new CfInvoke(Opcodes.INVOKESPECIAL, bridgeAndTarget.getBridge(), false));
- }
+ private DesugarDescription desugarInvokeInstruction(CfInvoke invoke) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) -> {
+ DexMethod invokedMethod = invoke.getMethod();
+ BridgeAndTarget<DexClassAndMethod> bridgeAndTarget =
+ bridgeAndTargetForDesugaring(
+ invokedMethod, context, this::getConstructorArgumentClass);
+ assert bridgeAndTarget != null;
+ // All bridges for program methods must have been added through the prepare step.
+ assert !bridgeAndTarget.getTarget().isProgramMethod()
+ || bridgeAndTarget
+ .getTarget()
+ .getHolder()
+ .lookupDirectMethod(bridgeAndTarget.getBridge())
+ != null;
+ if (bridgeAndTarget.getTarget().getDefinition().isInstanceInitializer()) {
+ assert !invoke.isInterface();
+ // Ensure room on the stack for the extra null argument.
+ localStackAllocator.allocateLocalStack(1);
+ return ImmutableList.of(
+ new CfConstNull(),
+ new CfInvoke(Opcodes.INVOKESPECIAL, bridgeAndTarget.getBridge(), false));
+ }
- return ImmutableList.of(
- new CfInvoke(Opcodes.INVOKESTATIC, bridgeAndTarget.getBridge(), invoke.isInterface()));
+ return ImmutableList.of(
+ new CfInvoke(
+ Opcodes.INVOKESTATIC, bridgeAndTarget.getBridge(), invoke.isInterface()));
+ })
+ .build();
}
RuntimeException reportIncompleteNest(LibraryMember<?, ?> member) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
index ffbea66..cc5e605 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
@@ -173,22 +173,7 @@
public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
if (instruction.isInvokeDynamic()) {
if (needsDesugaring(instruction.asInvokeDynamic(), context)) {
- return DesugarDescription.builder()
- .setDesugarRewrite(
- (freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- ignore, // context
- methodProcessingContext,
- desugaringCollection,
- dexItemFactory) ->
- desugarInvokeDynamicOnRecord(
- instruction.asInvokeDynamic(),
- localStackAllocator,
- eventConsumer,
- context,
- methodProcessingContext))
- .build();
+ return desugarInvokeDynamic(instruction);
} else {
return DesugarDescription.nothing();
}
@@ -199,18 +184,7 @@
DexMethod newMethod =
rewriteMethod(cfInvoke.getMethod(), cfInvoke.isInvokeSuper(context.getHolderType()));
assert newMethod != cfInvoke.getMethod();
- return DesugarDescription.builder()
- .setDesugarRewrite(
- (freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- ignore, // context
- methodProcessingContext,
- desugaringCollection,
- dexItemFactory) ->
- Collections.singletonList(
- new CfInvoke(cfInvoke.getOpcode(), newMethod, cfInvoke.isInterface())))
- .build();
+ return desugarInvoke(cfInvoke, newMethod);
} else {
return DesugarDescription.nothing();
}
@@ -218,6 +192,40 @@
return DesugarDescription.nothing();
}
+ private DesugarDescription desugarInvokeDynamic(CfInstruction instruction) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) ->
+ desugarInvokeDynamicOnRecord(
+ instruction.asInvokeDynamic(),
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext))
+ .build();
+ }
+
+ private DesugarDescription desugarInvoke(CfInvoke invoke, DexMethod newMethod) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) ->
+ Collections.singletonList(
+ new CfInvoke(invoke.getOpcode(), newMethod, invoke.isInterface())))
+ .build();
+ }
+
private List<CfInstruction> desugarInvokeDynamicOnRecord(
CfInvokeDynamic invokeDynamic,
LocalStackAllocator localStackAllocator,
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 726ce09..994d47f 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
@@ -80,7 +80,7 @@
return desugarMakeConcat(invoke);
}
if (bootstrapMethod == factory.stringConcatFactoryMembers.makeConcatWithConstants) {
- return desugarMakeConcatWithConstants(invoke, context);
+ return desugarMakeConcatWithConstants(invoke);
}
}
}
@@ -122,14 +122,13 @@
return builder.desugar(localStackAllocator);
}
- private DesugarDescription desugarMakeConcatWithConstants(
- CfInvokeDynamic invoke, ProgramMethod context) {
+ private DesugarDescription desugarMakeConcatWithConstants(CfInvokeDynamic invoke) {
return DesugarDescription.builder()
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
eventConsumer,
- ignore, // context
+ context,
methodProcessingContext,
desugaringCollection,
dexItemFactory) ->