Merge commit '32965b078ef4fd0bf5c41354030fa7db20a32bbe' into dev-release
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 00dfa0b..cfccc2b 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -2261,7 +2261,6 @@
});
}
- @Deprecated
synchronized public void forAllTypes(Consumer<DexType> f) {
new ArrayList<>(types.values()).forEach(f);
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexString.java b/src/main/java/com/android/tools/r8/graph/DexString.java
index b5d50f0..602a6b7 100644
--- a/src/main/java/com/android/tools/r8/graph/DexString.java
+++ b/src/main/java/com/android/tools/r8/graph/DexString.java
@@ -500,11 +500,4 @@
}
return arrayDim;
}
-
- public DexString toArrayDescriptor(int dimensions, DexItemFactory dexItemFactory) {
- byte[] newContent = new byte[content.length + dimensions];
- Arrays.fill(newContent, 0, dimensions, (byte) '[');
- System.arraycopy(content, 0, newContent, dimensions, content.length);
- return dexItemFactory.createString(size + dimensions, newContent);
- }
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexType.java b/src/main/java/com/android/tools/r8/graph/DexType.java
index b1892bf..f21e965 100644
--- a/src/main/java/com/android/tools/r8/graph/DexType.java
+++ b/src/main/java/com/android/tools/r8/graph/DexType.java
@@ -52,10 +52,6 @@
this.descriptor = descriptor;
}
- public DexString getDescriptor() {
- return descriptor;
- }
-
@Override
public int computeHashCode() {
return descriptor.hashCode();
@@ -435,7 +431,11 @@
}
public DexType toArrayType(int dimensions, DexItemFactory dexItemFactory) {
- return dexItemFactory.createType(descriptor.toArrayDescriptor(dimensions, dexItemFactory));
+ byte[] content = new byte[descriptor.content.length + dimensions];
+ Arrays.fill(content, 0, dimensions, (byte) '[');
+ System.arraycopy(descriptor.content, 0, content, dimensions, descriptor.content.length);
+ DexString newDesc = dexItemFactory.createString(descriptor.size + dimensions, content);
+ return dexItemFactory.createType(newDesc);
}
public DexType toArrayElementType(DexItemFactory dexItemFactory) {
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
index 20c918c..b276437 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -331,7 +331,9 @@
}
/** Lookup a rebound or non-rebound method reference using the current graph lens. */
- public abstract MethodLookupResult lookupMethod(DexMethod method, DexMethod context, Type type);
+ public MethodLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) {
+ return internalLookupMethod(method, context, type, result -> result);
+ }
protected abstract MethodLookupResult internalLookupMethod(
DexMethod reference, DexMethod context, Type type, LookupMethodContinuation continuation);
@@ -608,10 +610,6 @@
this.previousLens = previousLens;
}
- public final DexItemFactory dexItemFactory() {
- return dexItemFactory;
- }
-
public final GraphLens getPrevious() {
return previousLens;
}
@@ -624,20 +622,6 @@
}
@Override
- public MethodLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) {
- if (method.getHolderType().isArrayType()) {
- assert method.getName() == dexItemFactory.cloneMethodName;
- assert method.getReturnType() == dexItemFactory.objectType;
- return MethodLookupResult.builder(this)
- .setReference(method.withHolder(lookupType(method.getHolderType()), dexItemFactory))
- .setType(type)
- .build();
- }
- assert method.getHolderType().isClassType();
- return internalLookupMethod(method, context, type, result -> result);
- }
-
- @Override
public final DexType lookupType(DexType type) {
if (type.isPrimitiveType() || type.isVoidType() || type.isNullValueType()) {
return type;
@@ -760,11 +744,6 @@
}
@Override
- public MethodLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) {
- return MethodLookupResult.builder(this).setReference(method).setType(type).build();
- }
-
- @Override
public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
DexMethod method) {
return RewrittenPrototypeDescription.none();
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index ac21dd8..6f5a765 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -32,6 +32,8 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
import java.util.function.Predicate;
class ClassNameMinifier {
@@ -112,11 +114,14 @@
}
}
- ClassRenaming computeRenaming(Timing timing) {
- return computeRenaming(timing, Collections.emptyMap());
+ ClassRenaming computeRenaming(Timing timing, ExecutorService executorService)
+ throws ExecutionException {
+ return computeRenaming(timing, executorService, Collections.emptyMap());
}
- ClassRenaming computeRenaming(Timing timing, Map<DexType, DexString> syntheticClasses) {
+ ClassRenaming computeRenaming(
+ Timing timing, ExecutorService executorService, Map<DexType, DexString> syntheticClasses)
+ throws ExecutionException {
// Externally defined synthetic classes populate an initial renaming.
renaming.putAll(syntheticClasses);
@@ -154,6 +159,10 @@
}
timing.end();
+ timing.begin("rename-arrays");
+ appView.dexItemFactory().forAllTypes(this::renameArrayTypeIfNeeded);
+ timing.end();
+
return new ClassRenaming(Collections.unmodifiableMap(renaming), getPackageRenaming());
}
@@ -350,6 +359,23 @@
return state;
}
+ private void renameArrayTypeIfNeeded(DexType type) {
+ if (type.isArrayType()) {
+ DexType base = type.toBaseType(appView.dexItemFactory());
+ DexString value = renaming.get(base);
+ if (value != null) {
+ int dimensions = type.descriptor.numberOfLeadingSquareBrackets();
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < dimensions; i++) {
+ builder.append('[');
+ }
+ builder.append(value.toString());
+ DexString descriptor = appView.dexItemFactory().createString(builder.toString());
+ renaming.put(type, descriptor);
+ }
+ }
+ }
+
protected class Namespace implements InternalNamingState {
private final String packageName;
diff --git a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
index b7bfcdb..42a9287 100644
--- a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
@@ -17,7 +17,6 @@
import com.android.tools.r8.naming.ClassNameMinifier.ClassRenaming;
import com.android.tools.r8.naming.FieldNameMinifier.FieldRenaming;
import com.android.tools.r8.naming.MethodNameMinifier.MethodRenaming;
-import com.android.tools.r8.naming.NamingLens.NonIdentityNamingLens;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableMap;
@@ -28,7 +27,7 @@
import java.util.function.Function;
import java.util.function.Predicate;
-class MinifiedRenaming extends NonIdentityNamingLens {
+class MinifiedRenaming extends NamingLens {
final AppView<? extends AppInfoWithClassHierarchy> appView;
private final Map<String, String> packageRenaming;
@@ -39,7 +38,6 @@
ClassRenaming classRenaming,
MethodRenaming methodRenaming,
FieldRenaming fieldRenaming) {
- super(appView.dexItemFactory());
this.appView = appView;
this.packageRenaming = classRenaming.packageRenaming;
renaming.putAll(classRenaming.classRenaming);
@@ -53,7 +51,7 @@
}
@Override
- protected DexString internalLookupClassDescriptor(DexType type) {
+ public DexString lookupDescriptor(DexType type) {
return renaming.getOrDefault(type, type.descriptor);
}
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index b886f2b..3d27387 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -58,7 +58,7 @@
new MinificationPackageNamingStrategy(appView),
// Use deterministic class order to make sure renaming is deterministic.
appView.appInfo().classesWithDeterministicOrder());
- ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing);
+ ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing, executorService);
timing.end();
assert new MinifiedRenaming(
diff --git a/src/main/java/com/android/tools/r8/naming/NamingLens.java b/src/main/java/com/android/tools/r8/naming/NamingLens.java
index 9147b84..77b5b12 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingLens.java
@@ -45,13 +45,6 @@
public abstract DexString lookupDescriptor(DexType type);
- public DexString lookupClassDescriptor(DexType type) {
- assert type.isClassType();
- return internalLookupClassDescriptor(type);
- }
-
- protected abstract DexString internalLookupClassDescriptor(DexType type);
-
public abstract DexString lookupInnerName(InnerClassAttribute attribute, InternalOptions options);
public abstract DexString lookupName(DexMethod method);
@@ -123,7 +116,7 @@
return type.replaceBaseType(newBaseType, dexItemFactory);
}
assert type.isClassType();
- return dexItemFactory.createType(lookupClassDescriptor(type));
+ return dexItemFactory.createType(lookupDescriptor(type));
}
public boolean hasPrefixRewritingLogic() {
@@ -186,34 +179,7 @@
return true;
}
- public abstract static class NonIdentityNamingLens extends NamingLens {
-
- private final DexItemFactory dexItemFactory;
-
- protected NonIdentityNamingLens(DexItemFactory dexItemFactory) {
- this.dexItemFactory = dexItemFactory;
- }
-
- protected DexItemFactory dexItemFactory() {
- return dexItemFactory;
- }
-
- @Override
- public final DexString lookupDescriptor(DexType type) {
- if (type.isPrimitiveType() || type.isVoidType() || type.isNullValueType()) {
- return type.getDescriptor();
- }
- if (type.isArrayType()) {
- DexType baseType = type.toBaseType(dexItemFactory);
- DexString desc = lookupDescriptor(baseType);
- return desc.toArrayDescriptor(type.getNumberOfLeadingSquareBrackets(), dexItemFactory);
- }
- assert type.isClassType();
- return lookupClassDescriptor(type);
- }
- }
-
- private static final class IdentityLens extends NamingLens {
+ private static class IdentityLens extends NamingLens {
private IdentityLens() {
// Intentionally left empty.
@@ -225,11 +191,6 @@
}
@Override
- protected DexString internalLookupClassDescriptor(DexType type) {
- return type.descriptor;
- }
-
- @Override
public DexString lookupInnerName(InnerClassAttribute attribute, InternalOptions options) {
return attribute.getInnerName();
}
diff --git a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
index e987def..a1451fc 100644
--- a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
@@ -11,7 +11,6 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.InnerClassAttribute;
-import com.android.tools.r8.naming.NamingLens.NonIdentityNamingLens;
import com.android.tools.r8.utils.InternalOptions;
import java.util.Collections;
import java.util.HashMap;
@@ -22,7 +21,7 @@
import java.util.stream.Stream;
// Naming lens for rewriting type prefixes.
-public class PrefixRewritingNamingLens extends NonIdentityNamingLens {
+public class PrefixRewritingNamingLens extends NamingLens {
final NamingLens namingLens;
final InternalOptions options;
@@ -41,7 +40,6 @@
}
public PrefixRewritingNamingLens(NamingLens namingLens, AppView<?> appView) {
- super(appView.dexItemFactory());
this.appView = appView;
this.namingLens = namingLens;
this.options = appView.options();
@@ -70,7 +68,7 @@
}
@Override
- protected DexString internalLookupClassDescriptor(DexType type) {
+ public DexString lookupDescriptor(DexType type) {
DexString renaming = getRenaming(type);
return renaming != null ? renaming : namingLens.lookupDescriptor(type);
}
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index fab1147..a29f8ef 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -143,7 +143,7 @@
new MinificationPackageNamingStrategy(appView),
mappedClasses);
ClassRenaming classRenaming =
- classNameMinifier.computeRenaming(timing, syntheticCompanionClasses);
+ classNameMinifier.computeRenaming(timing, executorService, syntheticCompanionClasses);
timing.end();
ApplyMappingMemberNamingStrategy nameStrategy =
@@ -578,9 +578,9 @@
}
@Override
- protected DexString internalLookupClassDescriptor(DexType type) {
+ public DexString lookupDescriptor(DexType type) {
checkForUseOfNotMappedReference(type);
- return super.internalLookupClassDescriptor(type);
+ return super.lookupDescriptor(type);
}
private void checkForUseOfNotMappedReference(DexType type) {
diff --git a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
index 09ca5bd..50a6e69 100644
--- a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
+++ b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
@@ -15,7 +15,6 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.naming.NamingLens;
-import com.android.tools.r8.naming.NamingLens.NonIdentityNamingLens;
import com.android.tools.r8.references.PackageReference;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
@@ -96,18 +95,23 @@
return new RelocatorNamingLens(typeMappings, packingMappings.build(), appView.dexItemFactory());
}
- private static class RelocatorNamingLens extends NonIdentityNamingLens {
+ Map<DexType, DexString> getTypeMappings() {
+ return typeMappings;
+ }
+
+ private static class RelocatorNamingLens extends NamingLens {
private final Map<DexType, DexString> typeMappings;
private final Map<String, String> packageMappings;
+ private final DexItemFactory factory;
private RelocatorNamingLens(
Map<DexType, DexString> typeMappings,
Map<String, String> packageMappings,
DexItemFactory factory) {
- super(factory);
this.typeMappings = typeMappings;
this.packageMappings = packageMappings;
+ this.factory = factory;
}
@Override
@@ -116,7 +120,20 @@
}
@Override
- protected DexString internalLookupClassDescriptor(DexType type) {
+ public DexString lookupDescriptor(DexType type) {
+ if (type.isPrimitiveType() || type.isVoidType()) {
+ return type.descriptor;
+ }
+ if (type.isArrayType()) {
+ DexType baseType = type.toBaseType(factory);
+ if (baseType == null || baseType.isPrimitiveType()) {
+ return type.descriptor;
+ }
+ String baseDescriptor = typeMappings.getOrDefault(baseType, baseType.descriptor).toString();
+ return factory.createString(
+ DescriptorUtils.toArrayDescriptor(
+ type.getNumberOfLeadingSquareBrackets(), baseDescriptor));
+ }
return typeMappings.getOrDefault(type, type.descriptor);
}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithArrayMethodTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithArrayMethodTest.java
deleted file mode 100644
index 0216990..0000000
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithArrayMethodTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.repackage;
-
-import com.android.tools.r8.NeverInline;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class RepackageWithArrayMethodTest extends RepackageTestBase {
-
- public RepackageWithArrayMethodTest(
- String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) {
- super(flattenPackageHierarchyOrRepackageClasses, parameters);
- }
-
- @Test
- public void test() throws Exception {
- testForR8(parameters.getBackend())
- .addInnerClasses(getClass())
- .addKeepMainRule(TestClass.class)
- .apply(this::configureRepackaging)
- .enableInliningAnnotations()
- .setMinApi(parameters.getApiLevel())
- .compile()
- .inspect(this::inspect)
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutputLines("Hello world!");
- }
-
- private void inspect(CodeInspector inspector) {}
-
- public static class TestClass {
-
- public static void main(String[] args) {
- A[] array = new A[1];
- array[0] = new A();
- array.clone()[0].greet();
- }
- }
-
- public static class A {
-
- @NeverInline
- public void greet() {
- System.out.println("Hello world!");
- }
- }
-}