Use an id instead of a string for the compiler synthetics CF attribute
Bug: 147485959
Bug: 158159959
Change-Id: Iaa4726cbd5112977a57a9f287b14554d1c08629b
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
index 187b7dd..b5fc30d 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
@@ -59,8 +59,9 @@
char[] charBuffer,
int codeAttributeOffset,
Label[] labels) {
- String kindDescriptor = classReader.readUTF8(offset, charBuffer);
- SyntheticKind kind = SyntheticKind.fromDescriptor(kindDescriptor);
+ short id = classReader.readShort(offset);
+ assert id >= 0;
+ SyntheticKind kind = SyntheticKind.fromId(id);
return new MarkerAttribute(kind);
}
@@ -68,7 +69,8 @@
protected ByteVector write(
ClassWriter classWriter, byte[] code, int codeLength, int maxStack, int maxLocals) {
ByteVector byteVector = new ByteVector();
- byteVector.putShort(classWriter.newUTF8(kind.descriptor));
+ assert 0 <= kind.id && kind.id <= Short.MAX_VALUE;
+ byteVector.putShort(kind.id);
return byteVector;
}
}
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index 13e1fe4..ce1647b 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -23,47 +23,53 @@
*/
public enum SyntheticKind {
// Class synthetics.
- RECORD_TAG("", false, true, true),
- COMPANION_CLASS("-CC", false, true),
- EMULATED_INTERFACE_CLASS("-EL", false, true),
- LAMBDA("Lambda", false),
- INIT_TYPE_ARGUMENT("-IA", false, true),
- HORIZONTAL_INIT_TYPE_ARGUMENT_1(SYNTHETIC_CLASS_SEPARATOR + "IA$1", false, true),
- HORIZONTAL_INIT_TYPE_ARGUMENT_2(SYNTHETIC_CLASS_SEPARATOR + "IA$2", false, true),
- HORIZONTAL_INIT_TYPE_ARGUMENT_3(SYNTHETIC_CLASS_SEPARATOR + "IA$3", false, true),
+ RECORD_TAG("", 1, false, true, true),
+ COMPANION_CLASS("-CC", 2, false, true),
+ EMULATED_INTERFACE_CLASS("-EL", 3, false, true),
+ LAMBDA("Lambda", 4, false),
+ INIT_TYPE_ARGUMENT("-IA", 5, false, true),
+ HORIZONTAL_INIT_TYPE_ARGUMENT_1(SYNTHETIC_CLASS_SEPARATOR + "IA$1", 6, false, true),
+ HORIZONTAL_INIT_TYPE_ARGUMENT_2(SYNTHETIC_CLASS_SEPARATOR + "IA$2", 7, false, true),
+ HORIZONTAL_INIT_TYPE_ARGUMENT_3(SYNTHETIC_CLASS_SEPARATOR + "IA$3", 8, false, true),
// Method synthetics.
- RECORD_HELPER("Record", true),
- BACKPORT("Backport", true),
- STATIC_INTERFACE_CALL("StaticInterfaceCall", true),
- TO_STRING_IF_NOT_NULL("ToStringIfNotNull", true),
- THROW_CCE_IF_NOT_NULL("ThrowCCEIfNotNull", true),
- THROW_IAE("ThrowIAE", true),
- THROW_ICCE("ThrowICCE", true),
- THROW_NSME("ThrowNSME", true),
- TWR_CLOSE_RESOURCE("TwrCloseResource", true),
- SERVICE_LOADER("ServiceLoad", true),
- OUTLINE("Outline", true);
+ RECORD_HELPER("Record", 9, true),
+ BACKPORT("Backport", 10, true),
+ STATIC_INTERFACE_CALL("StaticInterfaceCall", 11, true),
+ TO_STRING_IF_NOT_NULL("ToStringIfNotNull", 12, true),
+ THROW_CCE_IF_NOT_NULL("ThrowCCEIfNotNull", 13, true),
+ THROW_IAE("ThrowIAE", 14, true),
+ THROW_ICCE("ThrowICCE", 15, true),
+ THROW_NSME("ThrowNSME", 16, true),
+ TWR_CLOSE_RESOURCE("TwrCloseResource", 17, true),
+ SERVICE_LOADER("ServiceLoad", 18, true),
+ OUTLINE("Outline", 19, true);
public final String descriptor;
+ public final int id;
public final boolean isSingleSyntheticMethod;
public final boolean isFixedSuffixSynthetic;
public final boolean mayOverridesNonProgramType;
- SyntheticKind(String descriptor, boolean isSingleSyntheticMethod) {
- this(descriptor, isSingleSyntheticMethod, false);
- }
-
- SyntheticKind(
- String descriptor, boolean isSingleSyntheticMethod, boolean isFixedSuffixSynthetic) {
- this(descriptor, isSingleSyntheticMethod, isFixedSuffixSynthetic, false);
+ SyntheticKind(String descriptor, int id, boolean isSingleSyntheticMethod) {
+ this(descriptor, id, isSingleSyntheticMethod, false);
}
SyntheticKind(
String descriptor,
+ int id,
+ boolean isSingleSyntheticMethod,
+ boolean isFixedSuffixSynthetic) {
+ this(descriptor, id, isSingleSyntheticMethod, isFixedSuffixSynthetic, false);
+ }
+
+ SyntheticKind(
+ String descriptor,
+ int id,
boolean isSingleSyntheticMethod,
boolean isFixedSuffixSynthetic,
boolean mayOverridesNonProgramType) {
this.descriptor = descriptor;
+ this.id = id;
this.isSingleSyntheticMethod = isSingleSyntheticMethod;
this.isFixedSuffixSynthetic = isFixedSuffixSynthetic;
this.mayOverridesNonProgramType = mayOverridesNonProgramType;
@@ -81,6 +87,15 @@
}
return null;
}
+
+ public static SyntheticKind fromId(int id) {
+ for (SyntheticKind kind : values()) {
+ if (kind.id == id) {
+ return kind;
+ }
+ }
+ return null;
+ }
}
private static final String SYNTHETIC_CLASS_SEPARATOR = "$$";