Don't parse generic signatures if reading DEX with pass through
Bug: 175372515
Change-Id: Idcb6d6d5ab87ccf1cb3a5fe9e936d830ec5c96ca
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 48fded1..2408b27 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -53,6 +53,8 @@
import com.android.tools.r8.graph.FieldAccessFlags;
import com.android.tools.r8.graph.GenericSignature;
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
+import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
+import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -62,7 +64,6 @@
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Pair;
-import com.android.tools.r8.utils.Reporter;
import com.google.common.io.ByteStreams;
import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
@@ -636,18 +637,19 @@
}
}
DexAnnotationSet fieldAnnotations = annotationIterator.getNextFor(field);
- String fieldSignature = DexAnnotation.getSignature(fieldAnnotations, dexItemFactory);
- if (fieldSignature != null) {
- fieldAnnotations = fieldAnnotations.getWithout(dexItemFactory.annotationSignature);
+ FieldTypeSignature fieldTypeSignature = FieldTypeSignature.noSignature();
+ if (!options.passthroughDexCode) {
+ String fieldSignature = DexAnnotation.getSignature(fieldAnnotations, dexItemFactory);
+ if (fieldSignature != null) {
+ fieldAnnotations = fieldAnnotations.getWithout(dexItemFactory.annotationSignature);
+ fieldTypeSignature =
+ GenericSignature.parseFieldTypeSignature(
+ field.name.toString(), fieldSignature, origin, dexItemFactory, options.reporter);
+ }
}
fields[i] =
new DexEncodedField(
- field,
- accessFlags,
- GenericSignature.parseFieldTypeSignature(
- field.name.toString(), fieldSignature, origin, dexItemFactory, options.reporter),
- fieldAnnotations,
- staticValue);
+ field, accessFlags, fieldTypeSignature, fieldAnnotations, staticValue);
}
return fields;
}
@@ -676,20 +678,25 @@
DexMethod method = indexedItems.getMethod(methodIndex);
accessFlags.setConstructor(method, dexItemFactory);
DexAnnotationSet methodAnnotations = annotationIterator.getNextFor(method);
- String methodSignature = DexAnnotation.getSignature(methodAnnotations, dexItemFactory);
- if (methodSignature != null) {
- methodAnnotations = methodAnnotations.getWithout(dexItemFactory.annotationSignature);
- }
- methods[i] =
- new DexEncodedMethod(
- method,
- accessFlags,
+ MethodTypeSignature methodTypeSignature = MethodTypeSignature.noSignature();
+ if (!options.passthroughDexCode) {
+ String methodSignature = DexAnnotation.getSignature(methodAnnotations, dexItemFactory);
+ if (methodSignature != null) {
+ methodAnnotations = methodAnnotations.getWithout(dexItemFactory.annotationSignature);
+ methodTypeSignature =
GenericSignature.parseMethodSignature(
method.name.toString(),
methodSignature,
origin,
dexItemFactory,
- options.reporter),
+ options.reporter);
+ }
+ }
+ methods[i] =
+ new DexEncodedMethod(
+ method,
+ accessFlags,
+ methodTypeSignature,
methodAnnotations,
parameterAnnotationsIterator.getNextFor(method),
code);
@@ -783,8 +790,7 @@
}
AttributesAndAnnotations attrs =
- new AttributesAndAnnotations(
- type, origin, annotationsDirectory.clazz, options.itemFactory, options.reporter);
+ new AttributesAndAnnotations(type, origin, annotationsDirectory.clazz, options);
Long finalChecksum = checksum;
ChecksumSupplier checksumSupplier =
@@ -1380,15 +1386,12 @@
}
public AttributesAndAnnotations(
- DexType type,
- Origin origin,
- DexAnnotationSet annotations,
- DexItemFactory factory,
- Reporter reporter) {
+ DexType type, Origin origin, DexAnnotationSet annotations, InternalOptions options) {
this.originalAnnotations = annotations;
DexType enclosingClass = null;
DexMethod enclosingMethod = null;
List<DexType> memberClasses = null;
+ DexItemFactory factory = options.dexItemFactory();
for (int i = 0; i < annotations.annotations.length; i++) {
DexAnnotation annotation = annotations.annotations[i];
@@ -1415,12 +1418,13 @@
} else {
memberClasses.addAll(members);
}
- } else if (DexAnnotation.isSignatureAnnotation(annotation, factory)) {
+ } else if (DexAnnotation.isSignatureAnnotation(annotation, factory)
+ && !options.passthroughDexCode) {
ensureAnnotations(i);
String signature = DexAnnotation.getSignature(annotation);
classSignature =
GenericSignature.parseClassSignature(
- type.getName(), signature, origin, factory, reporter);
+ type.getName(), signature, origin, factory, options.reporter);
} else {
copyAnnotation(annotation);
}