Experimental flag to not make the fields in lambda classes final
Bug: 182065081
Change-Id: Ie4a344838fef0a5cbbfb6e25162daa9dea3cf499
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java b/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java
index 29e68bf..95b2a6f 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessFlags.java
@@ -81,6 +81,10 @@
Constants.ACC_PUBLIC | Constants.ACC_FINAL | Constants.ACC_SYNTHETIC);
}
+ public static FieldAccessFlags createPublicSynthetic() {
+ return fromSharedAccessFlags(Constants.ACC_PUBLIC | Constants.ACC_SYNTHETIC);
+ }
+
public static FieldAccessFlags fromSharedAccessFlags(int access) {
assert (access & FLAGS) == access;
return new FieldAccessFlags(access & FLAGS);
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 bbc30e8..cd17565 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
@@ -236,7 +236,10 @@
fields.add(
DexEncodedField.syntheticBuilder()
.setField(getCaptureField(i))
- .setAccessFlags(FieldAccessFlags.createPublicFinalSynthetic())
+ .setAccessFlags(
+ appView.options().desugarSpecificOptions().lambdaClassFieldsFinal
+ ? FieldAccessFlags.createPublicFinalSynthetic()
+ : FieldAccessFlags.createPublicSynthetic())
// The api level is computed when tracing.
.disableAndroidApiLevelCheck()
.build());
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index b5235d2..9449f1b 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1203,6 +1203,9 @@
// See b/191469661 for why this is here.
public boolean noCfMarkerForDesugaredCode =
System.getProperty("com.android.tools.r8.noCfMarkerForDesugaredCode") != null;
+ // See b/182065081 for why this is here.
+ public boolean lambdaClassFieldsFinal =
+ System.getProperty("com.android.tools.r8.lambdaClassFieldsNotFinal") == null;
}
public class CallSiteOptimizationOptions {