Ensure lambda desugaring never exceeds class file method size limit
Bug: b/225839019
Change-Id: Ib19ff165493de159e44d3ca5a020a49a3eaa2c28
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 a6934c4..8e23208 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
@@ -116,6 +116,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 234c2fe..0d2810f 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
@@ -50,6 +50,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfDesugaringInfo.java b/src/main/java/com/android/tools/r8/ir/desugar/CfDesugaringInfo.java
new file mode 100644
index 0000000..280b30b
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfDesugaringInfo.java
@@ -0,0 +1,10 @@
+// Copyright (c) 2023, 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.ir.desugar;
+
+public interface CfDesugaringInfo {
+
+ boolean canIncreaseBytecodeSize();
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
index 90eda8a..bcace75 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
@@ -63,6 +63,7 @@
CfInstruction instruction,
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext);
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 ab7f14a..635f975 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
@@ -35,6 +35,7 @@
public Collection<CfInstruction> desugarInstruction(
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
@@ -62,6 +63,7 @@
Collection<CfInstruction> desugarInstruction(
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
@@ -141,6 +143,7 @@
public Collection<CfInstruction> desugarInstruction(
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
@@ -151,6 +154,7 @@
: desugarRewrite.desugarInstruction(
freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
index 64bc96e..b8a7565 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
@@ -55,6 +55,7 @@
CfInstruction instruction,
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext) {
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 79041fe..867a9c7 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
@@ -43,6 +43,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 dc59f92..44f9afd 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
@@ -84,7 +84,8 @@
LambdaInstructionDesugaring desugaring,
ProgramMethod accessedFrom,
LambdaDescriptor descriptor,
- DesugarInvoke desugarInvoke) {
+ DesugarInvoke desugarInvoke,
+ boolean useFactoryMethodForConstruction) {
assert desugaring != null;
assert descriptor != null;
this.type = builder.getType();
@@ -109,7 +110,8 @@
? factory.createField(type, type, factory.lambdaInstanceFieldName)
: null;
this.factoryMethod =
- appView.options().testing.alwaysGenerateLambdaFactoryMethods
+ useFactoryMethodForConstruction
+ || appView.options().testing.alwaysGenerateLambdaFactoryMethods
? factory.createMethod(
type,
factory.createProto(type, descriptor.captures.values),
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 d16016a..3ae702e 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
@@ -230,6 +230,25 @@
IntBox maxStackForCode = new IntBox(cfCode.getMaxStack());
IntBox maxStackForInstruction = new IntBox(cfCode.getMaxStack());
+ class CfDesugaringInfoImpl implements CfDesugaringInfo {
+ int bytecodeSizeUpperBound;
+
+ private CfDesugaringInfoImpl(int bytecodeSizeUpperBound) {
+ this.bytecodeSizeUpperBound = bytecodeSizeUpperBound;
+ }
+
+ @Override
+ public boolean canIncreaseBytecodeSize() {
+ return bytecodeSizeUpperBound < 65000;
+ }
+
+ private void updateBytecodeSize(int delta) {
+ bytecodeSizeUpperBound += delta;
+ }
+ }
+
+ CfDesugaringInfoImpl desugaringInfo = new CfDesugaringInfoImpl(cfCode.bytecodeSizeUpperBound());
+
List<CfInstruction> desugaredInstructions =
ListUtils.flatMapSameType(
cfCode.getInstructions(),
@@ -239,6 +258,7 @@
instruction,
maxLocalsForInstruction::getAndIncrement,
maxStackForInstruction::getAndIncrement,
+ desugaringInfo,
eventConsumer,
method,
methodProcessingContext);
@@ -247,6 +267,10 @@
// and reset the next temporary locals register.
maxLocalsForCode.setMax(maxLocalsForInstruction.getAndSet(cfCode.getMaxLocals()));
maxStackForCode.setMax(maxStackForInstruction.getAndSet(cfCode.getMaxStack()));
+ // Record the change in bytecode size.
+ desugaringInfo.updateBytecodeSize(-instruction.bytecodeSizeUpperBound());
+ replacement.forEach(
+ i -> desugaringInfo.updateBytecodeSize(i.bytecodeSizeUpperBound()));
} else {
// The next temporary locals register should be unchanged.
assert maxLocalsForInstruction.get() == cfCode.getMaxLocals();
@@ -293,6 +317,7 @@
CfInstruction instruction,
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext) {
@@ -302,6 +327,7 @@
instruction,
freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -315,6 +341,7 @@
instruction,
freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -325,6 +352,7 @@
CfInstruction instruction,
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
@@ -337,6 +365,7 @@
.desugarInstruction(
freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 31c2f61..4a64cba 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
@@ -167,6 +167,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -220,6 +221,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -269,6 +271,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -312,6 +315,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -356,6 +360,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 9085bd8..a1657bd 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
@@ -76,6 +76,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context1,
methodProcessingContext,
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 5021e7b..d8796a6 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
@@ -97,6 +97,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context1,
methodProcessingContext,
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 4c56b9b..0bb4dff 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
@@ -98,6 +98,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
theContext,
methodProcessingContext,
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 a602e52..5028df9 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
@@ -51,6 +51,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java
index 2c039d1..7776a31 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java
@@ -100,6 +100,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
localContext,
methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
index 85154ce..d83a724 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
@@ -109,6 +109,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -135,6 +136,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context1,
methodProcessingContext,
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 e7a534f..0d70826 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
@@ -72,6 +72,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -95,6 +96,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 c946b68..092423e 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
@@ -70,6 +70,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -85,6 +86,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 4912fe6..275d2c2 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
@@ -433,6 +433,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context1,
methodProcessingContext,
@@ -482,6 +483,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context12,
methodProcessingContext,
@@ -528,6 +530,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context1,
methodProcessingContext,
@@ -576,6 +579,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context1,
methodProcessingContext,
@@ -616,6 +620,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context12,
methodProcessingContext,
@@ -736,6 +741,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context1,
methodProcessingContext,
@@ -759,6 +765,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context12,
methodProcessingContext,
@@ -823,6 +830,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context13,
methodProcessingContext,
@@ -850,6 +858,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context14,
methodProcessingContext,
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 aea4f4b..6eb429f 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
@@ -22,6 +22,7 @@
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.ValueType;
+import com.android.tools.r8.ir.desugar.CfDesugaringInfo;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaring;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.DesugarDescription;
@@ -79,6 +80,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -88,6 +90,7 @@
instruction.asInvokeDynamic(),
freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -96,6 +99,7 @@
invoke,
localProvider,
stackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext)))
@@ -113,12 +117,18 @@
CfInvokeDynamic invoke,
FreshLocalProvider freshLocalProvider,
LocalStackAllocator localStackAllocator,
+ CfDesugaringInfo desugaringInfo,
LambdaDesugaringEventConsumer eventConsumer,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
DesugarInvoke desugarInvoke) {
LambdaClass lambdaClass =
- createLambdaClass(invoke, context, methodProcessingContext, desugarInvoke);
+ createLambdaClass(
+ invoke,
+ context,
+ methodProcessingContext,
+ desugarInvoke,
+ !desugaringInfo.canIncreaseBytecodeSize());
if (lambdaClass == null) {
return null;
}
@@ -161,7 +171,8 @@
CfInvokeDynamic invoke,
ProgramMethod context,
MethodProcessingContext methodProcessingContext,
- DesugarInvoke desugarInvoke) {
+ DesugarInvoke desugarInvoke,
+ boolean useFactoryMethodForConstruction) {
LambdaDescriptor descriptor =
LambdaDescriptor.tryInfer(
invoke.getCallSite(), appView, appView.appInfoForDesugaring(), context);
@@ -180,7 +191,13 @@
builder ->
box.set(
new LambdaClass(
- builder, appView, this, context, descriptor, desugarInvoke)));
+ builder,
+ appView,
+ this,
+ context,
+ descriptor,
+ desugarInvoke,
+ useFactoryMethodForConstruction)));
// Immediately set the actual program class on the lambda.
LambdaClass lambdaClass = box.get();
lambdaClass.setClass(clazz);
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 54f5677..6678a66 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
@@ -337,6 +337,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -367,6 +368,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 9bc7654..bdbd423 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
@@ -199,6 +199,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -218,6 +219,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 52ac56e..eda990b 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
@@ -93,6 +93,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -128,6 +129,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 9127af6..a0ec6dd 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
@@ -70,6 +70,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -94,6 +95,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -115,6 +117,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
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 bb81445..18ddcef 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
@@ -326,6 +326,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -352,6 +353,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -378,6 +380,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
@@ -405,6 +408,7 @@
.setDesugarRewrite(
(freshLocalProvider,
localStackAllocator,
+ desugaringInfo,
eventConsumer,
context,
methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
index 181723e..40b7606 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -172,7 +172,9 @@
@Override
public void acceptLambdaClass(LambdaClass lambdaClass, ProgramMethod context) {
addLambdaClassAndInstanceInitializersIfSynthesizingContextIsInProfile(lambdaClass, context);
+ addLambdaFactoryMethodIfSynthesizingContextIsInProfile(lambdaClass, context);
addLambdaVirtualMethodsIfLambdaImplementationIsInProfile(lambdaClass, context);
+
parent.acceptLambdaClass(lambdaClass, context);
}
@@ -194,6 +196,16 @@
}
@SuppressWarnings("ReferenceEquality")
+ private void addLambdaFactoryMethodIfSynthesizingContextIsInProfile(
+ LambdaClass lambdaClass, ProgramMethod context) {
+ if (lambdaClass.hasFactoryMethod()) {
+ additionsCollection.applyIfContextIsInProfile(
+ context,
+ additionsBuilder -> additionsBuilder.addMethodRule(lambdaClass.getFactoryMethod()));
+ }
+ }
+
+ @SuppressWarnings("ReferenceEquality")
private void addLambdaVirtualMethodsIfLambdaImplementationIsInProfile(
LambdaClass lambdaClass, ProgramMethod context) {
Target target = lambdaClass.getTarget();
diff --git a/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java b/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java
index 45f1165..c242996 100644
--- a/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java
+++ b/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java
@@ -3,10 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.desugar.lambdas;
-import static org.junit.Assert.assertThrows;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.DesugarTestConfiguration;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -63,44 +59,7 @@
@Test
public void testDesugaring() throws Exception {
- // Cf to cf desugaring fails generating too large method in class file.
- if (parameters.isCfRuntime()) {
- assertThrows(
- CompilationFailedException.class,
- () ->
- testForDesugaring(
- parameters,
- (options) -> {
- /* no options change */
- },
- configuration -> configuration == DesugarTestConfiguration.D8_CF)
- .addProgramClasses(MyConsumer.class, MyTriConsumer.class)
- .addProgramClassFileData(generateTestClass())
- .run(parameters.getRuntime(), TestClass.class));
- } else {
- assertThrows(
- CompilationFailedException.class,
- () ->
- testForDesugaring(
- parameters,
- (options) -> {
- /* no options change */
- },
- configuration -> configuration == DesugarTestConfiguration.D8_CF_D8_DEX)
- .addProgramClasses(MyConsumer.class, MyTriConsumer.class)
- .addProgramClassFileData(generateTestClass())
- .run(parameters.getRuntime(), TestClass.class));
- }
-
- // Desugaring directly to DEX works with large methods.
- testForDesugaring(
- parameters,
- (options) -> {
- /* no options change */
- },
- configuration ->
- configuration != DesugarTestConfiguration.D8_CF
- && configuration != DesugarTestConfiguration.D8_CF_D8_DEX)
+ testForDesugaring(parameters)
.addProgramClasses(MyConsumer.class, MyTriConsumer.class)
.addProgramClassFileData(generateTestClass())
.run(parameters.getRuntime(), TestClass.class)
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index b475941..931fe23 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -150,12 +150,6 @@
def setUpFakeAndroidHome(androidHomeTemp):
# Bazel will check if 30 is present then extract android.jar from 32.
# We copy android.jar from third_party to mimic repository structure.
- subpath = os.path.join(androidHomeTemp, "build-tools")
- cmd = ["mkdir", subpath]
- subprocess.check_call(cmd)
- subpath = os.path.join(subpath, "32.0.0")
- cmd = ["mkdir", subpath]
- subprocess.check_call(cmd)
subpath = os.path.join(androidHomeTemp, "platforms")
cmd = ["mkdir", subpath]
subprocess.check_call(cmd)