Register markers at creation time into own collection
Change-Id: I2412f93d70330ec9eb448d3eb3468a7e11e40404
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 52eafdb..96a4596 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -1296,7 +1296,10 @@
read = dexReader.get();
os.write(read);
} while (read != 0);
- return dexItemFactory.createString(size, os.toByteArray());
+ byte[] content = os.toByteArray();
+ return Marker.hasMarkerPrefix(content)
+ ? dexItemFactory.createMarkerString(size, content)
+ : dexItemFactory.createString(size, content);
}
private DexType typeAt(int index) {
diff --git a/src/main/java/com/android/tools/r8/dex/Marker.java b/src/main/java/com/android/tools/r8/dex/Marker.java
index b308d5d..911789d 100644
--- a/src/main/java/com/android/tools/r8/dex/Marker.java
+++ b/src/main/java/com/android/tools/r8/dex/Marker.java
@@ -257,9 +257,7 @@
// Try to parse str as a marker.
// Returns null if parsing fails.
public static Marker parse(DexString dexString) {
- if (dexString.size > 2
- && dexString.content[0] == PREFIX_CHAR
- && dexString.content[1] == PREFIX_CHAR) {
+ if (hasMarkerPrefix(dexString.content)) {
String str = dexString.toString();
if (str.startsWith(D8_PREFIX)) {
return internalParse(Tool.D8, str.substring(D8_PREFIX.length() - 1));
@@ -274,6 +272,10 @@
return null;
}
+ public static boolean hasMarkerPrefix(byte[] content) {
+ return content.length > 2 && content[0] == PREFIX_CHAR && content[1] == PREFIX_CHAR;
+ }
+
private static Marker internalParse(Tool tool, String str) {
try {
JsonElement result = new JsonParser().parse(str);
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index b10a4f5..9620ee4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -81,6 +81,7 @@
/** Set of types that may be synthesized during compilation. */
private final Set<DexType> possibleCompilerSynthesizedTypes = Sets.newIdentityHashSet();
+ private final Map<DexString, DexString> markers = new ConcurrentHashMap<>();
private final Map<DexString, DexString> strings = new ConcurrentHashMap<>();
private final Map<DexString, DexType> types = new ConcurrentHashMap<>();
private final Map<DexField, DexField> fields = new ConcurrentHashMap<>();
@@ -2321,6 +2322,22 @@
return previous == null ? item : previous;
}
+ public DexString createMarkerString(int size, byte[] content) {
+ DexString potentialMarker = createString(size, content);
+ if (Marker.hasMarkerPrefix(potentialMarker.content)) {
+ markers.put(potentialMarker, potentialMarker);
+ }
+ return potentialMarker;
+ }
+
+ public DexString createMarkerString(String marker) {
+ DexString potentialMarker = createString(marker);
+ if (Marker.hasMarkerPrefix(potentialMarker.content)) {
+ markers.put(potentialMarker, potentialMarker);
+ }
+ return potentialMarker;
+ }
+
public DexString createString(int size, byte[] content) {
assert !sorted;
return canonicalize(strings, new DexString(size, content));
@@ -2601,9 +2618,8 @@
// Debugging support to extract marking string.
// Find all markers.
public synchronized Collection<Marker> extractMarkers() {
- // This is slow but it is not needed for any production code yet.
Set<Marker> markers = new HashSet<>();
- for (DexString dexString : strings.keySet()) {
+ for (DexString dexString : this.markers.keySet()) {
Marker marker = Marker.parse(dexString);
if (marker != null) {
markers.add(marker);
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index f648f90..6b9015b 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -142,7 +142,7 @@
CfApplicationWriter.MARKER_STRING_CONSTANT_POOL_INDEX,
new char[reader.getMaxStringLength()]);
if (maybeMarker instanceof String) {
- application.getFactory().createString((String) maybeMarker);
+ application.getFactory().createMarkerString((String) maybeMarker);
}
} catch (IllegalArgumentException e) {
// Ignore if the type of the constant is not something readConst() allows.