Work-around debug info in the enum unboxer
Change-Id: Ie3c60dbc4b8cf623b053028a683d170af7cd9962
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 486aaa7..9532f1e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -312,6 +312,17 @@
return new EventBasedDebugInfo(eventBasedInfo.startLine, newParameters, eventBasedInfo.events);
}
+ public DexDebugInfo debugInfoWithExtraParameters(DexItemFactory factory, int extraParameters) {
+ EventBasedDebugInfo eventBasedInfo = DexDebugInfo.convertToEventBased(this, factory);
+ if (eventBasedInfo == null) {
+ return eventBasedInfo;
+ }
+ DexString[] parameters = eventBasedInfo.parameters;
+ DexString[] newParameters = new DexString[parameters.length + extraParameters];
+ System.arraycopy(parameters, 0, newParameters, 0, parameters.length);
+ return new EventBasedDebugInfo(eventBasedInfo.startLine, newParameters, eventBasedInfo.events);
+ }
+
@Override
public Code getCodeAsInlining(
DexMethod caller, DexMethod callee, DexItemFactory factory, boolean isCalleeD8R8Synthesized) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index f9a5279..1c502d5 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -1011,6 +1011,20 @@
}
}
+ public static void setDebugInfoWithExtraParameters(
+ Code code, int arity, int extraParameters, AppView<?> appView) {
+ if (code.isDexCode()) {
+ DexCode dexCode = code.asDexCode();
+ DexDebugInfo newDebugInfo =
+ dexCode.debugInfoWithExtraParameters(appView.dexItemFactory(), extraParameters);
+ assert (newDebugInfo == null) || (arity == newDebugInfo.getParameterCount());
+ dexCode.setDebugInfo(newDebugInfo);
+ } else {
+ assert code.isCfCode();
+ // We don't have anything to do for Cf.
+ }
+ }
+
private DexCode toDexCodeThatLogsError(DexItemFactory itemFactory) {
checkIfObsolete();
Signature signature = MethodSignature.fromDexMethod(getReference());
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index e0d0b36..de2b9cf 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -822,15 +822,24 @@
RewrittenPrototypeDescription prototypeChanges =
lensBuilder.moveAndMap(
method.getReference(), newMethod, isStatic, isStatic, extraUnusedNullParameters);
- return method.toTypeSubstitutedMethod(
- newMethod,
- builder ->
- builder
- .fixupOptimizationInfo(
- appView, prototypeChanges.createMethodOptimizationInfoFixer())
- .setCompilationState(method.getCompilationState())
- .setIsLibraryMethodOverrideIf(
- method.isNonPrivateVirtualMethod(), OptionalBool.FALSE));
+ DexEncodedMethod newEncodedMethod =
+ method.toTypeSubstitutedMethod(
+ newMethod,
+ builder ->
+ builder
+ .fixupOptimizationInfo(
+ appView, prototypeChanges.createMethodOptimizationInfoFixer())
+ .setCompilationState(method.getCompilationState())
+ .setIsLibraryMethodOverrideIf(
+ method.isNonPrivateVirtualMethod(), OptionalBool.FALSE));
+ if (!extraUnusedNullParameters.isEmpty() && method.getCode() != null) {
+ DexEncodedMethod.setDebugInfoWithExtraParameters(
+ newEncodedMethod.getCode(),
+ newMethod.getArity(),
+ extraUnusedNullParameters.size(),
+ appView);
+ }
+ return newEncodedMethod;
}
private DexEncodedField fixupEncodedField(DexEncodedField encodedField) {