Fix FileChannelMapMode rewriting
Bug: 222647019
Change-Id: If4fefc393ad5a46f95fb72535228870c489bce35
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_path.json b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
index 010492e..d8bf9f2 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_path.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
@@ -128,6 +128,9 @@
"java.util.function.": "j$.util.function.",
"java.util.stream.": "j$.util.stream."
},
+ "dont_rewrite_prefix": [
+ "java.nio.channels.FileChannel$MapMode"
+ ],
"maintain_prefix": [
"java.io.UncheckedIOException"
],
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
index 1663694..027a2ae 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
@@ -52,6 +52,7 @@
static final String WRAPPER_CONVERSION_EXCLUDING_KEY = "wrapper_conversion_excluding";
static final String CUSTOM_CONVERSION_KEY = "custom_conversion";
static final String REWRITE_PREFIX_KEY = "rewrite_prefix";
+ static final String DONT_REWRITE_PREFIX_KEY = "dont_rewrite_prefix";
static final String MAINTAIN_PREFIX_KEY = "maintain_prefix";
static final String RETARGET_STATIC_FIELD_KEY = "retarget_static_field";
static final String RETARGET_METHOD_KEY = "retarget_method";
@@ -255,6 +256,12 @@
builder.putMaintainPrefix(maintainPrefix.getAsString());
}
}
+ if (jsonFlagSet.has(DONT_REWRITE_PREFIX_KEY)) {
+ for (JsonElement dontRewritePrefix :
+ jsonFlagSet.get(DONT_REWRITE_PREFIX_KEY).getAsJsonArray()) {
+ builder.putDontRewritePrefix(dontRewritePrefix.getAsString());
+ }
+ }
if (jsonFlagSet.has(REWRITE_DERIVED_PREFIX_KEY)) {
for (Map.Entry<String, JsonElement> prefixToMatch :
jsonFlagSet.get(REWRITE_DERIVED_PREFIX_KEY).getAsJsonObject().entrySet()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
index 50e98e1..fc5bcca 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
@@ -26,6 +26,7 @@
public class HumanRewritingFlags {
private final Map<String, String> rewritePrefix;
+ private final Set<String> dontRewritePrefix;
private final Set<String> maintainPrefix;
private final Map<String, Map<String, String>> rewriteDerivedPrefix;
private final Map<DexType, DexType> emulatedInterfaces;
@@ -42,6 +43,7 @@
HumanRewritingFlags(
Map<String, String> rewritePrefix,
+ Set<String> dontRewritePrefix,
Set<String> maintainPrefix,
Map<String, Map<String, String>> rewriteDerivedPrefix,
Map<DexType, DexType> emulateLibraryInterface,
@@ -56,6 +58,7 @@
Map<DexMethod, MethodAccessFlags> amendLibraryMethod,
Map<DexField, FieldAccessFlags> amendLibraryField) {
this.rewritePrefix = rewritePrefix;
+ this.dontRewritePrefix = dontRewritePrefix;
this.maintainPrefix = maintainPrefix;
this.rewriteDerivedPrefix = rewriteDerivedPrefix;
this.emulatedInterfaces = emulateLibraryInterface;
@@ -75,6 +78,7 @@
return new HumanRewritingFlags(
ImmutableMap.of(),
ImmutableSet.of(),
+ ImmutableSet.of(),
ImmutableMap.of(),
ImmutableMap.of(),
ImmutableMap.of(),
@@ -98,6 +102,7 @@
reporter,
origin,
rewritePrefix,
+ dontRewritePrefix,
maintainPrefix,
rewriteDerivedPrefix,
emulatedInterfaces,
@@ -117,6 +122,10 @@
return rewritePrefix;
}
+ public Set<String> getDontRewritePrefix() {
+ return dontRewritePrefix;
+ }
+
public Set<String> getMaintainPrefix() {
return maintainPrefix;
}
@@ -185,6 +194,7 @@
private final Origin origin;
private final Map<String, String> rewritePrefix;
+ private final Set<String> dontRewritePrefix;
private final Set<String> maintainPrefix;
private final Map<String, Map<String, String>> rewriteDerivedPrefix;
private final Map<DexType, DexType> emulatedInterfaces;
@@ -205,6 +215,7 @@
origin,
new HashMap<>(),
Sets.newIdentityHashSet(),
+ Sets.newIdentityHashSet(),
new HashMap<>(),
new IdentityHashMap<>(),
new IdentityHashMap<>(),
@@ -223,6 +234,7 @@
Reporter reporter,
Origin origin,
Map<String, String> rewritePrefix,
+ Set<String> dontRewritePrefix,
Set<String> maintainPrefix,
Map<String, Map<String, String>> rewriteDerivedPrefix,
Map<DexType, DexType> emulateLibraryInterface,
@@ -239,6 +251,7 @@
this.reporter = reporter;
this.origin = origin;
this.rewritePrefix = new HashMap<>(rewritePrefix);
+ this.dontRewritePrefix = Sets.newHashSet(dontRewritePrefix);
this.maintainPrefix = Sets.newHashSet(maintainPrefix);
this.rewriteDerivedPrefix = new HashMap<>(rewriteDerivedPrefix);
this.emulatedInterfaces = new IdentityHashMap<>(emulateLibraryInterface);
@@ -281,6 +294,11 @@
return this;
}
+ public Builder putDontRewritePrefix(String prefix) {
+ dontRewritePrefix.add(prefix);
+ return this;
+ }
+
public Builder putMaintainPrefix(String prefix) {
maintainPrefix.add(prefix);
return this;
@@ -385,6 +403,7 @@
validate();
return new HumanRewritingFlags(
ImmutableMap.copyOf(rewritePrefix),
+ ImmutableSet.copyOf(dontRewritePrefix),
ImmutableSet.copyOf(maintainPrefix),
ImmutableMap.copyOf(rewriteDerivedPrefix),
ImmutableMap.copyOf(emulatedInterfaces),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
index 50a0190..8cb5743 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
@@ -27,6 +27,7 @@
private final boolean libraryCompilation;
private final Map<DexString, DexString> descriptorPrefix;
private final Set<DexString> descriptorMaintainPrefix;
+ private final Set<DexString> descriptorDontRewritePrefix;
private final Map<DexString, Map<DexString, DexString>> descriptorDifferentPrefix;
private final Set<DexString> usedPrefix = Sets.newIdentityHashSet();
@@ -40,7 +41,8 @@
this.synthesizedPrefix = humanSpec.getSynthesizedLibraryClassesPackagePrefix();
this.libraryCompilation = humanSpec.isLibraryCompilation();
this.descriptorPrefix = convertRewritePrefix(rewritingFlags.getRewritePrefix());
- this.descriptorMaintainPrefix = convertMaintainPrefix(rewritingFlags.getMaintainPrefix());
+ this.descriptorDontRewritePrefix = convertPrefixSet(rewritingFlags.getDontRewritePrefix());
+ this.descriptorMaintainPrefix = convertPrefixSet(rewritingFlags.getMaintainPrefix());
this.descriptorDifferentPrefix =
convertRewriteDifferentPrefix(rewritingFlags.getRewriteDerivedPrefix());
}
@@ -115,6 +117,9 @@
private void registerType(DexType type) {
DexType rewrittenType = rewrittenType(type);
if (rewrittenType != null) {
+ if (prefixMatching(type, descriptorDontRewritePrefix) != null) {
+ return;
+ }
builder.rewriteType(type, rewrittenType);
}
}
@@ -179,7 +184,7 @@
return mapBuilder.build();
}
- private ImmutableSet<DexString> convertMaintainPrefix(Set<String> maintainPrefix) {
+ private ImmutableSet<DexString> convertPrefixSet(Set<String> maintainPrefix) {
ImmutableSet.Builder<DexString> builder = ImmutableSet.builder();
for (String prefix : maintainPrefix) {
builder.add(toDescriptorPrefix(prefix));