Version 2.0.49
Cherry pick: Do not create EnumSwitchInfo in presence of unexpected switch key
CL: https://r8-review.googlesource.com/c/r8/+/49201
(Partial) Cherry pick: Desugared lib: fix minification
CL: https://r8-review.googlesource.com/c/r8/+/48306
(Partial) Cherry pick: Desugared lib: more R8 tests
CL: https://r8-review.googlesource.com/c/r8/+/48388
Change-Id: I5cc5550e6e3a8087ed21da854b89fdb573616c6d
Bug: 149554602, 150927764
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 6a23a85..b78cf12 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 = "2.0.48";
+ public static final String LABEL = "2.0.49";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 65e86b7..7f439de 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -1070,8 +1070,9 @@
Int2IntMap targetMap = new Int2IntArrayMap();
for (int i = 0; i < switchInsn.numberOfKeys(); i++) {
assert switchInsn.targetBlockIndices()[i] != switchInsn.getFallthroughBlockIndex();
- EnumValueInfo valueInfo =
- info.valueInfoMap.get(info.indexMap.get(switchInsn.getKey(i)));
+ int key = switchInsn.getKey(i);
+ DexField field = info.indexMap.get(key);
+ EnumValueInfo valueInfo = info.valueInfoMap.get(field);
targetMap.put(valueInfo.ordinal, switchInsn.targetBlockIndices()[i]);
}
int[] keys = targetMap.keySet().toIntArray();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java b/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java
index 0dd0bcf..99573ca 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/SwitchUtils.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.code.ArrayGet;
import com.android.tools.r8.ir.code.Instruction;
+import com.android.tools.r8.ir.code.IntSwitch;
import com.android.tools.r8.ir.code.InvokeVirtual;
import com.android.tools.r8.ir.code.StaticGet;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -59,8 +60,7 @@
* and {@link SwitchMapCollector} for details.
*/
public static EnumSwitchInfo analyzeSwitchOverEnum(
- Instruction switchInsn, AppView<AppInfoWithLiveness> appView) {
- AppInfoWithLiveness appInfo = appView.appInfo();
+ IntSwitch switchInsn, AppView<AppInfoWithLiveness> appView) {
Instruction input = switchInsn.inValues().get(0).definition;
if (input == null || !input.isArrayGet()) {
return null;
@@ -72,8 +72,8 @@
}
InvokeVirtual ordinalInvoke = index.asInvokeVirtual();
DexMethod ordinalMethod = ordinalInvoke.getInvokedMethod();
- DexClass enumClass = appInfo.definitionFor(ordinalMethod.holder);
- DexItemFactory dexItemFactory = appInfo.dexItemFactory();
+ DexClass enumClass = appView.definitionFor(ordinalMethod.holder);
+ DexItemFactory dexItemFactory = appView.dexItemFactory();
// After member rebinding, enumClass will be the actual java.lang.Enum class.
if (enumClass == null
|| (!enumClass.accessFlags.isEnum() && enumClass.type != dexItemFactory.enumType)
@@ -87,14 +87,19 @@
return null;
}
StaticGet staticGet = array.asStaticGet();
- Int2ReferenceMap<DexField> indexMap = appInfo.getSwitchMapFor(staticGet.getField());
+ Int2ReferenceMap<DexField> indexMap = appView.appInfo().getSwitchMapFor(staticGet.getField());
if (indexMap == null || indexMap.isEmpty()) {
return null;
}
+ for (int key : switchInsn.getKeys()) {
+ if (!indexMap.containsKey(key)) {
+ return null;
+ }
+ }
// Due to member rebinding, only the fields are certain to provide the actual enums
// class.
DexType enumType = indexMap.values().iterator().next().holder;
- Map<DexField, EnumValueInfo> valueInfoMap = appInfo.getEnumValueInfoMapFor(enumType);
+ Map<DexField, EnumValueInfo> valueInfoMap = appView.appInfo().getEnumValueInfoMapFor(enumType);
if (valueInfoMap == null) {
return null;
}