Set compilation state during enum unboxer fixup
Change-Id: I2c1c3707eae7da473dd45dab734dfedb0e9a5cfc
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 7fbfd5a..c92307e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -201,6 +201,10 @@
return accessFlags;
}
+ public CompilationState getCompilationState() {
+ return compilationState;
+ }
+
public DexEncodedMethod getDefaultInterfaceMethodImplementation() {
return defaultInterfaceMethodImplementation;
}
@@ -1511,12 +1515,26 @@
this.method = method;
}
+ public Builder setCompilationState(CompilationState compilationState) {
+ assert this.compilationState == CompilationState.NOT_PROCESSED;
+ this.compilationState = compilationState;
+ return this;
+ }
+
public Builder setIsLibraryMethodOverride(OptionalBool isLibraryMethodOverride) {
assert !isLibraryMethodOverride.isUnknown();
this.isLibraryMethodOverride = isLibraryMethodOverride;
return this;
}
+ public Builder setIsLibraryMethodOverrideIf(
+ boolean condition, OptionalBool isLibraryMethodOverride) {
+ if (condition) {
+ return setIsLibraryMethodOverride(isLibraryMethodOverride);
+ }
+ return this;
+ }
+
public Builder setParameterAnnotations(ParameterAnnotationsList parameterAnnotations) {
this.parameterAnnotations = parameterAnnotations;
return this;
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 4df9c8d..280dc9b 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
@@ -116,28 +116,30 @@
return encodedMethod.toTypeSubstitutedMethod(newMethod);
}
- private DexEncodedMethod fixupEncodedMethod(DexEncodedMethod encodedMethod) {
- DexProto newProto = fixupProto(encodedMethod.proto());
- if (newProto == encodedMethod.proto()) {
- return encodedMethod;
+ private DexEncodedMethod fixupEncodedMethod(DexEncodedMethod method) {
+ DexProto newProto = fixupProto(method.proto());
+ if (newProto == method.proto()) {
+ return method;
}
- assert !encodedMethod.isClassInitializer();
+ assert !method.isClassInitializer();
// We add the $enumunboxing$ suffix to make sure we do not create a library override.
String newMethodName =
- encodedMethod.getName().toString()
- + (encodedMethod.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
- DexMethod newMethod = factory.createMethod(encodedMethod.holder(), newProto, newMethodName);
- newMethod = ensureUniqueMethod(encodedMethod, newMethod);
- int numberOfExtraNullParameters = newMethod.getArity() - encodedMethod.method.getArity();
- boolean isStatic = encodedMethod.isStatic();
- lensBuilder.move(
- encodedMethod.method, newMethod, isStatic, isStatic, numberOfExtraNullParameters);
- DexEncodedMethod newEncodedMethod = encodedMethod.toTypeSubstitutedMethod(newMethod);
- assert !encodedMethod.isLibraryMethodOverride().isTrue()
+ method.getName().toString() + (method.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
+ DexMethod newMethod = factory.createMethod(method.getHolderType(), newProto, newMethodName);
+ newMethod = ensureUniqueMethod(method, newMethod);
+ int numberOfExtraNullParameters = newMethod.getArity() - method.method.getArity();
+ boolean isStatic = method.isStatic();
+ lensBuilder.move(method.method, newMethod, isStatic, isStatic, numberOfExtraNullParameters);
+ DexEncodedMethod newEncodedMethod =
+ method.toTypeSubstitutedMethod(
+ newMethod,
+ builder ->
+ builder
+ .setCompilationState(method.getCompilationState())
+ .setIsLibraryMethodOverrideIf(
+ method.isNonPrivateVirtualMethod(), OptionalBool.FALSE));
+ assert !method.isLibraryMethodOverride().isTrue()
: "Enum unboxing is changing the signature of a library override in a non unboxed class.";
- if (newEncodedMethod.isNonPrivateVirtualMethod()) {
- newEncodedMethod.setLibraryMethodOverride(OptionalBool.FALSE);
- }
return newEncodedMethod;
}