Remove CfInstructionDesugaring default methods
Bug: b/270021543
Change-Id: Ia2b28a27120a6010ebd92747bf6026ed0285ebee
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 f65d62c..f5db966 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
@@ -5,11 +5,8 @@
package com.android.tools.r8.ir.desugar;
import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.ProgramMethod;
-import java.util.Collection;
/** Interface for desugaring a single class-file instruction. */
public interface CfInstructionDesugaring {
@@ -34,39 +31,6 @@
}
/**
- * Given an instruction, returns the list of instructions that the instruction should be desugared
- * to. If no desugaring is needed, {@code null} should be returned (for efficiency).
- */
- default Collection<CfInstruction> desugarInstruction(
- CfInstruction instruction,
- FreshLocalProvider freshLocalProvider,
- LocalStackAllocator localStackAllocator,
- CfInstructionDesugaringEventConsumer eventConsumer,
- ProgramMethod context,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringCollection desugaringCollection,
- DexItemFactory dexItemFactory) {
- return compute(instruction, context)
- .desugarInstruction(
- freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- context,
- methodProcessingContext,
- desugaringCollection,
- dexItemFactory);
- }
-
- /**
- * Returns true if the given instruction needs desugaring.
- *
- * <p>This should return true if-and-only-if {@link #desugarInstruction} returns non-null.
- */
- default boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
- return compute(instruction, context).needsDesugaring();
- }
-
- /**
* Returns true if and only if needsDesugaring() answering true implies a desugaring is needed.
* Some optimizations may have some heuristics, so that needsDesugaring() answers true in rare
* case even if no desugaring is needed.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
index 97216e8..85059be 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
@@ -263,13 +263,13 @@
method.getDefinition().getCode().asCfCode().getInstructions()) {
for (CfInstructionDesugaring impreciseDesugaring :
Iterables.filter(desugarings, desugaring -> !desugaring.hasPreciseNeedsDesugaring())) {
- if (impreciseDesugaring.needsDesugaring(instruction, method)) {
+ if (impreciseDesugaring.compute(instruction, method).needsDesugaring()) {
foundFalsePositive = true;
}
}
for (CfInstructionDesugaring preciseDesugaring :
Iterables.filter(desugarings, desugaring -> desugaring.hasPreciseNeedsDesugaring())) {
- assert !preciseDesugaring.needsDesugaring(instruction, method);
+ assert !preciseDesugaring.compute(instruction, method).needsDesugaring();
}
}
assert foundFalsePositive;
@@ -320,17 +320,17 @@
while (iterator.hasNext()) {
CfInstructionDesugaring desugaring = iterator.next();
Collection<CfInstruction> replacement =
- desugaring.desugarInstruction(
- instruction,
- freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- context,
- methodProcessingContext,
- this,
- appView.dexItemFactory());
+ desugaring
+ .compute(instruction, context)
+ .desugarInstruction(
+ freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext,
+ this,
+ appView.dexItemFactory());
if (replacement != null) {
- assert desugaring.needsDesugaring(instruction, context);
assert verifyNoOtherDesugaringNeeded(instruction, context, iterator, desugaring);
return replacement;
}
@@ -359,9 +359,10 @@
private boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
return Iterables.any(
- desugarings, desugaring -> desugaring.needsDesugaring(instruction, context))
+ desugarings, desugaring -> desugaring.compute(instruction, context).needsDesugaring())
|| Iterables.any(
- yieldingDesugarings, desugaring -> desugaring.needsDesugaring(instruction, context));
+ yieldingDesugarings,
+ desugaring -> desugaring.compute(instruction, context).needsDesugaring());
}
private boolean verifyNoOtherDesugaringNeeded(
@@ -371,7 +372,7 @@
CfInstructionDesugaring appliedDesugaring) {
iterator.forEachRemaining(
desugaring -> {
- boolean alsoApplicable = desugaring.needsDesugaring(instruction, context);
+ boolean alsoApplicable = desugaring.compute(instruction, context).needsDesugaring();
// TODO(b/187913003): As part of precise interface desugaring, make sure the
// identification is explicitly non-overlapping and remove the exceptions below.
assert !alsoApplicable
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 b62d335..2e14022 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
@@ -26,7 +26,6 @@
import com.android.tools.r8.errors.UnsupportedInvokePolymorphicMethodHandleDiagnostic;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexCallSite;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
@@ -41,7 +40,6 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;
import com.google.common.collect.Sets;
-import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.objectweb.asm.Opcodes;
@@ -366,7 +364,8 @@
matchers = builder.build();
}
- private DesugarDescription compute(CfInstruction instruction) {
+ @Override
+ public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
for (InstructionMatcher matcher : matchers) {
DesugarDescription result = matcher.compute(instruction);
if (result != null) {
@@ -375,30 +374,4 @@
}
return DesugarDescription.nothing();
}
-
- @Override
- public Collection<CfInstruction> desugarInstruction(
- CfInstruction instruction,
- FreshLocalProvider freshLocalProvider,
- LocalStackAllocator localStackAllocator,
- CfInstructionDesugaringEventConsumer eventConsumer,
- ProgramMethod context,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringCollection desugaringCollection,
- DexItemFactory dexItemFactory) {
- return compute(instruction)
- .desugarInstruction(
- freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- context,
- methodProcessingContext,
- desugaringCollection,
- dexItemFactory);
- }
-
- @Override
- public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
- return compute(instruction).needsDesugaring();
- }
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index e750e9f..292a3b3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -184,7 +184,7 @@
private boolean isAlreadyDesugared(CfInvoke invoke, ProgramMethod context) {
return Iterables.any(
- precedingDesugarings, desugaring -> desugaring.needsDesugaring(invoke, context));
+ precedingDesugarings, desugaring -> desugaring.compute(invoke, context).needsDesugaring());
}
public static DexMethod methodWithVivifiedTypeInSignature(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
index 5c956aa..cf713d7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
@@ -8,20 +8,14 @@
import com.android.tools.r8.cf.code.CfInstruction;
import com.android.tools.r8.cf.code.CfInvoke;
import com.android.tools.r8.cf.code.CfTypeInstruction;
-import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
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.FreshLocalProvider;
-import com.android.tools.r8.ir.desugar.LocalStackAllocator;
-import java.util.Collection;
-import java.util.Collections;
+import com.android.tools.r8.ir.desugar.DesugarDescription;
+import com.google.common.collect.ImmutableList;
/**
* Disables the rewriting of types in specific classes declared in the desugared library
@@ -44,22 +38,25 @@
}
@Override
- public Collection<CfInstruction> desugarInstruction(
- CfInstruction instruction,
- FreshLocalProvider freshLocalProvider,
- LocalStackAllocator localStackAllocator,
- CfInstructionDesugaringEventConsumer eventConsumer,
- ProgramMethod context,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringCollection desugaringCollection,
- DexItemFactory dexItemFactory) {
+ public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
CfInstruction replacement = rewriteInstruction(instruction, context);
- return replacement == null ? null : Collections.singleton(replacement);
+ if (replacement == null) {
+ return DesugarDescription.nothing();
+ }
+ return compute(replacement);
}
- @Override
- public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
- return rewriteInstruction(instruction, context) != null;
+ private DesugarDescription compute(CfInstruction replacement) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ context,
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) -> ImmutableList.of(replacement))
+ .build();
}
// TODO(b/261024278): Share this code.
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 ce4afdd..7695f1d 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
@@ -197,7 +197,7 @@
private boolean isAlreadyDesugared(CfInvoke invoke, ProgramMethod context) {
return Iterables.any(
- precedingDesugarings, desugaring -> desugaring.needsDesugaring(invoke, context));
+ precedingDesugarings, desugaring -> desugaring.compute(invoke, context).needsDesugaring());
}
@Override
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 e5cb38c..91b7639 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
@@ -288,7 +288,8 @@
}
return Iterables.any(
- code.asCfCode().getInstructions(), instruction -> needsDesugaring(instruction, method));
+ code.asCfCode().getInstructions(),
+ instruction -> compute(instruction, method).needsDesugaring());
}
public boolean needsDesugaring(DexMember<?, ?> memberReference, ProgramMethod context) {
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 cc5e605..4e982d8 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
@@ -101,7 +101,7 @@
ProgramAdditions programAdditions) {
CfCode cfCode = method.getDefinition().getCode().asCfCode();
for (CfInstruction instruction : cfCode.getInstructions()) {
- if (instruction.isInvokeDynamic() && needsDesugaring(instruction, method)) {
+ if (instruction.isInvokeDynamic() && compute(instruction, method).needsDesugaring()) {
prepareInvokeDynamicOnRecord(
instruction.asInvokeDynamic(), programAdditions, method, eventConsumer);
}
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 994d47f..158c97d 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
@@ -234,11 +234,6 @@
return builder.desugar(localStackAllocator);
}
- @Override
- public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
- return isStringConcatInvoke(instruction, factory);
- }
-
public static boolean isStringConcatInvoke(CfInstruction instruction, DexItemFactory factory) {
CfInvokeDynamic invoke = instruction.asInvokeDynamic();
if (invoke == null) {