Version 1.4.66
Cherry-pick: Rewrite array clone in lense code rewriter
CL: https://r8-review.googlesource.com/c/r8/+/35289
Bug: 124177369
Change-Id: I353977eabefcae16c2bd95c35d5aa19b747c89b2
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 8a35a7d..5d31bab 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 = "1.4.65";
+ public static final String LABEL = "1.4.66";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index fd968d6..d634827 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.graph.UseRegistry.MethodHandleUse.ARGUMENT_TO_LAMBDA_METAFACTORY;
import static com.android.tools.r8.graph.UseRegistry.MethodHandleUse.NOT_ARGUMENT_TO_LAMBDA_METAFACTORY;
import static com.android.tools.r8.ir.code.Invoke.Type.STATIC;
+import static com.android.tools.r8.ir.code.Invoke.Type.VIRTUAL;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
@@ -149,7 +150,31 @@
InvokeMethod invoke = current.asInvokeMethod();
DexMethod invokedMethod = invoke.getInvokedMethod();
DexType invokedHolder = invokedMethod.getHolder();
+ if (invokedHolder.isArrayType()) {
+ if (invokedMethod.name == appInfo.dexItemFactory.cloneMethodName) {
+ DexType baseType = invokedHolder.toBaseType(appInfo.dexItemFactory);
+ DexType mappedBaseType = graphLense.lookupType(baseType);
+ if (baseType != mappedBaseType) {
+ DexType mappedHolder =
+ invokedHolder.replaceBaseType(mappedBaseType, appInfo.dexItemFactory);
+ // The clone proto is ()Ljava/lang/Object;, so just reuse it.
+ DexMethod actualTarget =
+ appInfo.dexItemFactory.createMethod(
+ mappedHolder, invokedMethod.proto, appInfo.dexItemFactory.cloneMethodName);
+ Invoke newInvoke =
+ Invoke.create(
+ VIRTUAL,
+ actualTarget,
+ null,
+ makeOutValue(invoke, code, newSSAValues),
+ invoke.inValues());
+ iterator.replaceCurrentInstruction(newInvoke);
+ }
+ }
+ continue;
+ }
if (!invokedHolder.isClassType()) {
+ assert false;
continue;
}
if (invoke.isInvokeDirect()) {
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java
index 2500be1..08d0ff3 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java
@@ -79,10 +79,9 @@
: "state_X"; // mapped name without minification
FieldSubject stateA = enumSubject.uniqueFieldWithName(fieldName);
assertThat(stateA, isPresent());
- });
- // TODO(b/124177369): method signature Object Outer$InnerEnum[]#clone() left in values().
- // .run(MAIN)
- // .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ })
+ .run(MAIN)
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
}
}