Revert "Version 3.0.58"
This reverts commit 60fee6c2df4137110817144c947691b764956353.
Reason for revert: Waiting to confirm it solves the issue.
Change-Id: I3662a5c57c249424b1ee2b6c5c9193848f6c73b4
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index fe54549..75df46f 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "3.0.58";
+ public static final String LABEL = "3.0.57";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
index 73cbb37..4fdd8f6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
@@ -273,7 +273,7 @@
if (unboxedEnumsData.matchesValuesField(field)) {
utilityMethods.computeIfAbsent(
valuesUtilityMethod, m -> synthesizeValuesUtilityMethod());
- DexField fieldValues = null;
+ DexField fieldValues = createValuesField(holder);
DexMethod methodValues = createValuesMethod(holder);
utilityMethods.computeIfAbsent(
methodValues,
@@ -449,7 +449,7 @@
new EnumUnboxingCfCodeProvider.EnumUnboxingValuesCfCodeProvider(
appView, method.holder, fieldValues, numEnumInstances, valuesUtilityMethod)
.generateCfCode();
- return synthesizeUtilityMethod(cfCode, method, false);
+ return synthesizeUtilityMethod(cfCode, method, true);
}
private DexMethod computeInstanceFieldUtilityMethod(DexType enumType, DexField field) {
@@ -628,7 +628,6 @@
}
private DexEncodedMethod synthesizeUtilityMethod(CfCode cfCode, DexMethod method, boolean sync) {
- assert !sync;
return new DexEncodedMethod(
method,
synthesizedMethodAccessFlags(sync),
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
index 70baaab..d21c6d9 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.cf.code.CfConstNull;
import com.android.tools.r8.cf.code.CfConstNumber;
import com.android.tools.r8.cf.code.CfConstString;
+import com.android.tools.r8.cf.code.CfFieldInstruction;
import com.android.tools.r8.cf.code.CfFrame;
import com.android.tools.r8.cf.code.CfFrame.FrameType;
import com.android.tools.r8.cf.code.CfIf;
@@ -217,7 +218,7 @@
int numEnumInstances,
DexMethod initializationMethod) {
super(appView, holder);
- assert utilityField == null;
+ assert utilityField.type == appView.dexItemFactory().intArrayType;
this.utilityField = utilityField;
this.numEnumInstances = numEnumInstances;
this.initializationMethod = initializationMethod;
@@ -232,14 +233,19 @@
// VALUES$com$x$MyEnum = EnumUnboxingMethods_values(2);
// }
// return VALUES$com$x$MyEnum;
- // Due to b/191993388, this generates instead something like:
- // int[] UtilityClass#com$x$MyEnum_VALUES() {
- // return EnumUnboxingMethods_values(2);
- // }
List<CfInstruction> instructions = new ArrayList<>();
+ CfLabel nullDest = new CfLabel();
+ instructions.add(new CfFieldInstruction(Opcodes.GETSTATIC, utilityField, utilityField));
+ instructions.add(new CfIf(If.Type.NE, ValueType.OBJECT, nullDest));
instructions.add((new CfConstNumber(numEnumInstances, ValueType.INT)));
assert initializationMethod.getArity() == 1;
instructions.add(new CfInvoke(Opcodes.INVOKESTATIC, initializationMethod, false));
+ instructions.add(new CfFieldInstruction(Opcodes.PUTSTATIC, utilityField, utilityField));
+ instructions.add(nullDest);
+ instructions.add(
+ new CfFrame(
+ ImmutableInt2ReferenceSortedMap.<FrameType>builder().build(), ImmutableDeque.of()));
+ instructions.add(new CfFieldInstruction(Opcodes.GETSTATIC, utilityField, utilityField));
instructions.add(new CfReturn(ValueType.OBJECT));
return standardCfCodeFromInstructions(instructions);
}