Support U apis in desugared library
- Support for StackWalker#walk
Bug: b/242548283
Change-Id: I33bcff5e84133e8642412c600d07fce994646183
diff --git a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
index 2b46e36..d412e52 100644
--- a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
+++ b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
@@ -21,6 +21,7 @@
"j$/util/stream/Collector$Characteristics");
private static final Set<String> WRAP_CONVERT_OWNER =
ImmutableSet.of(
+ "j$/util/stream/Stream",
"j$/nio/file/spi/FileSystemProvider",
"j$/nio/file/spi/FileTypeDetector",
"j$/nio/file/Path",
diff --git a/src/library_desugar/java/j$/util/stream/Stream.java b/src/library_desugar/java/j$/util/stream/Stream.java
new file mode 100644
index 0000000..70c761a
--- /dev/null
+++ b/src/library_desugar/java/j$/util/stream/Stream.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, 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 j$.util.stream;
+
+public class Stream<T> {
+
+ public static java.util.stream.Stream<?> inverted_wrap_convert(j$.util.stream.Stream<?> stream) {
+ return null;
+ }
+
+ public static j$.util.stream.Stream<?> inverted_wrap_convert(java.util.stream.Stream<?> stream) {
+ return null;
+ }
+}
diff --git a/src/library_desugar/java/java/util/stream/StackWalkerApiFlips.java b/src/library_desugar/java/java/util/stream/StackWalkerApiFlips.java
new file mode 100644
index 0000000..300c5ad
--- /dev/null
+++ b/src/library_desugar/java/java/util/stream/StackWalkerApiFlips.java
@@ -0,0 +1,44 @@
+// Copyright (c) 2022, 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 java.util.stream;
+
+import static java.util.ConversionRuntimeException.exception;
+
+import java.util.function.Function;
+
+public class StackWalkerApiFlips {
+
+ public static Function<?, ?> flipFunctionStream(Function<?, ?> stackWalker) {
+ return new FunctionStreamWrapper<>(stackWalker);
+ }
+
+ public static class FunctionStreamWrapper<T, R> implements Function<T, R> {
+
+ public Function<T, R> function;
+
+ public FunctionStreamWrapper(Function<T, R> function) {
+ this.function = function;
+ }
+
+ private T flipStream(T maybeStream) {
+ if (maybeStream == null) {
+ return null;
+ }
+ if (maybeStream instanceof java.util.stream.Stream<?>) {
+ return (T)
+ j$.util.stream.Stream.inverted_wrap_convert((java.util.stream.Stream<?>) maybeStream);
+ }
+ if (maybeStream instanceof j$.util.stream.Stream<?>) {
+ return (T)
+ j$.util.stream.Stream.inverted_wrap_convert((j$.util.stream.Stream<?>) maybeStream);
+ }
+ throw exception("java.util.stream.Stream", maybeStream.getClass());
+ }
+
+ public R apply(T arg) {
+ return function.apply(flipStream(arg));
+ }
+ }
+}
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index 5f68c31..3eaff97 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -99,8 +99,12 @@
"java.util.Spliterator java.util.LinkedHashSet#spliterator()": "java.util.DesugarLinkedHashSet"
},
"api_generic_types_conversion": {
- "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"]
+ "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"],
+ "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)": [0, "java.util.function.Function java.util.stream.StackWalkerApiFlips#flipFunctionStream(java.util.function.Function)"]
},
+ "never_outline_api": [
+ "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)"
+ ],
"wrapper_conversion": [
"java.util.PrimitiveIterator$OfDouble",
"java.util.PrimitiveIterator$OfInt",
@@ -226,6 +230,9 @@
},
"java.util.Optional": {
"j$.util.Optional": "java.util.Optional"
+ },
+ "java.util.stream.Stream": {
+ "j$.util.stream.Stream": "java.util.stream.Stream"
}
}
}
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_path.json b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
index db95ccf..6b258dd 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_path.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
@@ -236,8 +236,12 @@
"java.util.Spliterator java.util.LinkedHashSet#spliterator()": "java.util.DesugarLinkedHashSet"
},
"api_generic_types_conversion": {
- "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"]
+ "java.util.Set java.util.stream.Collector#characteristics()" : [-1, "java.util.Set java.util.stream.StreamApiFlips#flipCharacteristicSet(java.util.Set)"],
+ "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)": [0, "java.util.function.Function java.util.stream.StackWalkerApiFlips#flipFunctionStream(java.util.function.Function)"]
},
+ "never_outline_api": [
+ "java.lang.Object java.lang.StackWalker#walk(java.util.function.Function)"
+ ],
"wrapper_conversion": [
"java.nio.channels.SeekableByteChannel",
"java.util.PrimitiveIterator$OfDouble",
@@ -436,6 +440,9 @@
},
"java.util.Optional": {
"j$.util.Optional": "java.util.Optional"
+ },
+ "java.util.stream.Stream": {
+ "j$.util.stream.Stream": "java.util.stream.Stream"
}
}
},
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index b4ece95..eeebd32 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -148,6 +148,14 @@
if (isAlreadyDesugared(invoke, context)) {
return false;
}
+ if (appView
+ .options()
+ .machineDesugaredLibrarySpecification
+ .getApiGenericConversion()
+ .get(invokedMethod.getReference())
+ != null) {
+ return true;
+ }
return appView.typeRewriter.hasRewrittenTypeInSignature(invokedMethod.getProto(), appView);
}
@@ -262,6 +270,15 @@
}
DexClassAndMethod methodForDesugaring = getMethodForDesugaring(invoke, context);
assert methodForDesugaring != null;
+ // Specific apis that we never want to outline, namely, apis for stack introspection since it
+ // confuses developers in debug mode.
+ if (appView
+ .options()
+ .machineDesugaredLibrarySpecification
+ .getNeverOutlineApi()
+ .contains(methodForDesugaring.getReference())) {
+ return false;
+ }
return methodForDesugaring.getAccessFlags().isPublic();
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
index 0e6bd6a..94bd06b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
@@ -586,6 +586,11 @@
appView.dexItemFactory().createProto(newReturnType, newParameterTypes),
method.name);
assert convertedAPI == methodWithVivifiedTypeInSignature(method, newHolder, appView)
+ || appView
+ .options()
+ .machineDesugaredLibrarySpecification
+ .getApiGenericConversion()
+ .containsKey(method)
|| invalidType(method, returnConversion, parameterConversions, appView) != null;
return convertedAPI;
}
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 0be57c5..16c578b 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
@@ -56,6 +56,7 @@
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 NEVER_OUTLINE_API_KEY = "never_outline_api";
static final String COVARIANT_RETARGET_METHOD_KEY = "covariant_retarget_method";
static final String RETARGET_METHOD_KEY = "retarget_method";
static final String RETARGET_METHOD_EMULATED_DISPATCH_KEY =
@@ -264,6 +265,11 @@
builder.putDontRewritePrefix(dontRewritePrefix.getAsString());
}
}
+ if (jsonFlagSet.has(NEVER_OUTLINE_API_KEY)) {
+ for (JsonElement neverOutlineApi : jsonFlagSet.get(NEVER_OUTLINE_API_KEY).getAsJsonArray()) {
+ builder.neverOutlineApi(parseMethod(neverOutlineApi.getAsString()));
+ }
+ }
if (jsonFlagSet.has(API_GENERIC_TYPES_CONVERSION)) {
for (Map.Entry<String, JsonElement> methodAndDescription :
jsonFlagSet.get(API_GENERIC_TYPES_CONVERSION).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 a927cdf..8c4316f 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
@@ -40,6 +40,7 @@
private final Set<DexMethod> dontRewriteInvocation;
private final Set<DexType> dontRetarget;
private final Map<DexType, Set<DexMethod>> wrapperConversions;
+ private final Set<DexMethod> neverOutlineApi;
private final Map<DexMethod, MethodAccessFlags> amendLibraryMethod;
private final Map<DexField, FieldAccessFlags> amendLibraryField;
@@ -59,6 +60,7 @@
Set<DexMethod> dontRewriteInvocation,
Set<DexType> dontRetarget,
Map<DexType, Set<DexMethod>> wrapperConversion,
+ Set<DexMethod> neverOutlineApi,
Map<DexMethod, MethodAccessFlags> amendLibraryMethod,
Map<DexField, FieldAccessFlags> amendLibraryField) {
this.rewritePrefix = rewritePrefix;
@@ -76,6 +78,7 @@
this.dontRewriteInvocation = dontRewriteInvocation;
this.dontRetarget = dontRetarget;
this.wrapperConversions = wrapperConversion;
+ this.neverOutlineApi = neverOutlineApi;
this.amendLibraryMethod = amendLibraryMethod;
this.amendLibraryField = amendLibraryField;
}
@@ -97,6 +100,7 @@
ImmutableSet.of(),
ImmutableSet.of(),
ImmutableMap.of(),
+ ImmutableSet.of(),
ImmutableMap.of(),
ImmutableMap.of());
}
@@ -124,6 +128,7 @@
dontRewriteInvocation,
dontRetarget,
wrapperConversions,
+ neverOutlineApi,
amendLibraryMethod,
amendLibraryField);
}
@@ -164,6 +169,10 @@
return retargetMethodEmulatedDispatch;
}
+ public Set<DexMethod> getNeverOutlineApi() {
+ return neverOutlineApi;
+ }
+
public Map<DexMethod, DexMethod[]> getApiGenericConversion() {
return apiGenericTypesConversion;
}
@@ -227,6 +236,7 @@
private final Set<DexMethod> dontRewriteInvocation;
private final Set<DexType> dontRetarget;
private final Map<DexType, Set<DexMethod>> wrapperConversions;
+ private final Set<DexMethod> neverOutlineApi;
private final Map<DexMethod, MethodAccessFlags> amendLibraryMethod;
private final Map<DexField, FieldAccessFlags> amendLibraryField;
@@ -249,6 +259,7 @@
Sets.newIdentityHashSet(),
Sets.newIdentityHashSet(),
new IdentityHashMap<>(),
+ Sets.newIdentityHashSet(),
new IdentityHashMap<>(),
new IdentityHashMap<>());
}
@@ -271,6 +282,7 @@
Set<DexMethod> dontRewriteInvocation,
Set<DexType> dontRetargetLibMember,
Map<DexType, Set<DexMethod>> wrapperConversions,
+ Set<DexMethod> neverOutlineApi,
Map<DexMethod, MethodAccessFlags> amendLibraryMethod,
Map<DexField, FieldAccessFlags> amendLibraryField) {
this.reporter = reporter;
@@ -292,6 +304,8 @@
this.dontRetarget = Sets.newIdentityHashSet();
this.dontRetarget.addAll(dontRetargetLibMember);
this.wrapperConversions = new IdentityHashMap<>(wrapperConversions);
+ this.neverOutlineApi = Sets.newIdentityHashSet();
+ this.neverOutlineApi.addAll(neverOutlineApi);
this.amendLibraryMethod = new IdentityHashMap<>(amendLibraryMethod);
this.amendLibraryField = new IdentityHashMap<>(amendLibraryField);
}
@@ -439,6 +453,11 @@
return this;
}
+ public Builder neverOutlineApi(DexMethod method) {
+ neverOutlineApi.add(method);
+ return this;
+ }
+
public Builder amendLibraryField(DexField member, FieldAccessFlags flags) {
amendLibraryField.put(member, flags);
return this;
@@ -462,6 +481,7 @@
ImmutableSet.copyOf(dontRewriteInvocation),
ImmutableSet.copyOf(dontRetarget),
ImmutableMap.copyOf(wrapperConversions),
+ ImmutableSet.copyOf(neverOutlineApi),
ImmutableMap.copyOf(amendLibraryMethod),
ImmutableMap.copyOf(amendLibraryField));
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
index 3de3ac0..e93c6c6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
@@ -143,7 +143,10 @@
}
private static Path getAndroidJarPath(AndroidApiLevel apiLevel) {
- String jar = String.format(ANDROID_JAR_PATTERN, apiLevel.getLevel());
+ String jar =
+ apiLevel == AndroidApiLevel.MASTER
+ ? "third_party/android_jar/lib-master/android.jar"
+ : String.format(ANDROID_JAR_PATTERN, apiLevel.getLevel());
return Paths.get(jar);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 1b83bf8..0278766 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -180,6 +180,10 @@
return rewritingFlags.getCustomConversions();
}
+ public Set<DexMethod> getNeverOutlineApi() {
+ return rewritingFlags.getNeverOutlineApi();
+ }
+
public Map<DexMethod, MethodAccessFlags> getAmendLibraryMethods() {
return rewritingFlags.getAmendLibraryMethod();
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
index 523042f..6d3f489 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -42,6 +42,7 @@
Map<DexType, DexType> legacyBackport,
Set<DexType> dontRetarget,
Map<DexType, CustomConversionDescriptor> customConversions,
+ Set<DexMethod> neverOutlineApi,
Map<DexMethod, MethodAccessFlags> amendLibraryMethods,
Map<DexField, FieldAccessFlags> amendLibraryFields) {
this.rewriteType = rewriteType;
@@ -60,6 +61,7 @@
this.legacyBackport = legacyBackport;
this.dontRetarget = dontRetarget;
this.customConversions = customConversions;
+ this.neverOutlineApi = neverOutlineApi;
this.amendLibraryMethod = amendLibraryMethods;
this.amendLibraryField = amendLibraryFields;
}
@@ -106,6 +108,7 @@
private final Map<DexType, DexType> legacyBackport;
private final Set<DexType> dontRetarget;
private final Map<DexType, CustomConversionDescriptor> customConversions;
+ private final Set<DexMethod> neverOutlineApi;
private final Map<DexMethod, MethodAccessFlags> amendLibraryMethod;
private final Map<DexField, FieldAccessFlags> amendLibraryField;
@@ -183,6 +186,10 @@
return customConversions;
}
+ public Set<DexMethod> getNeverOutlineApi() {
+ return neverOutlineApi;
+ }
+
public Map<DexMethod, MethodAccessFlags> getAmendLibraryMethod() {
return amendLibraryMethod;
}
@@ -253,6 +260,7 @@
private final ImmutableSet.Builder<DexType> dontRetarget = ImmutableSet.builder();
private final ImmutableMap.Builder<DexType, CustomConversionDescriptor> customConversions =
ImmutableMap.builder();
+ private final ImmutableSet.Builder<DexMethod> neverOutlineApi = ImmutableSet.builder();
private final ImmutableMap.Builder<DexMethod, MethodAccessFlags> amendLibraryMethod =
ImmutableMap.builder();
private final ImmutableMap.Builder<DexField, FieldAccessFlags> amendLibraryField =
@@ -311,6 +319,10 @@
this.wrappers.put(type, descriptor);
}
+ public void neverOutlineApi(DexMethod method) {
+ neverOutlineApi.add(method);
+ }
+
public void putLegacyBackport(DexType src, DexType target) {
legacyBackport.put(src, target);
}
@@ -370,6 +382,7 @@
legacyBackport.build(),
dontRetarget.build(),
customConversions.build(),
+ neverOutlineApi.build(),
amendLibraryMethod.build(),
amendLibraryField.build());
}
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 51262ef..520533b 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
@@ -55,6 +55,7 @@
rewriteValues(rewritingFlags.getCustomConversions());
rewriteEmulatedInterface(rewritingFlags.getEmulatedInterfaces());
rewriteRetargetKeys(rewritingFlags.getRetargetMethodEmulatedDispatch());
+ rewriteApiConversions(rewritingFlags.getApiGenericConversion());
warnIfUnusedPrefix(warnConsumer);
}
@@ -85,6 +86,17 @@
}
}
+ private void rewriteApiConversions(Map<DexMethod, DexMethod[]> apiGenericConversions) {
+ apiGenericConversions.forEach(
+ (k, v) -> {
+ for (DexMethod dexMethod : v) {
+ if (dexMethod != null) {
+ registerClassType(dexMethod.getHolderType());
+ }
+ }
+ });
+ }
+
private void rewriteEmulatedInterface(Map<DexType, DexType> emulateLibraryInterface) {
emulateLibraryInterface.forEach(builder::rewriteDerivedTypeOnly);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
index eb333a7..2773de6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
@@ -129,6 +129,7 @@
rewritingFlags.getAmendLibraryMethod().forEach(builder::amendLibraryMethod);
rewritingFlags.getAmendLibraryField().forEach(builder::amendLibraryField);
rewritingFlags.getApiGenericConversion().forEach(builder::addApiGenericTypesConversion);
+ rewritingFlags.getNeverOutlineApi().forEach(builder::neverOutlineApi);
new HumanToMachineRetargetConverter(appInfo)
.convertRetargetFlags(rewritingFlags, builder, this::warnMissingReferences);
new HumanToMachineEmulatedInterfaceConverter(appInfo)
diff --git a/src/test/examplesJava9/stackwalker/Example.java b/src/test/examplesJava9/stackwalker/Example.java
new file mode 100644
index 0000000..6208060
--- /dev/null
+++ b/src/test/examplesJava9/stackwalker/Example.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2022, 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 stackwalker;
+
+import java.lang.StackWalker.StackFrame;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Example {
+ public static void main(String[] args) {
+ List<String> OneFrameStack =
+ StackWalker.getInstance()
+ .walk(s -> s.limit(7).map(StackFrame::getMethodName).collect(Collectors.toList()));
+ System.out.println(OneFrameStack);
+ frame1();
+ }
+
+ public static void frame1() {
+ frame2();
+ }
+
+ public static void frame2() {
+ List<String> ThreeFrameStack =
+ StackWalker.getInstance()
+ .walk(s -> s.limit(7).map(StackFrame::getMethodName).collect(Collectors.toList()));
+ System.out.println(ThreeFrameStack);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
index 581a96c..90f6ec1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
@@ -147,7 +147,7 @@
// TODO: parameterize to check both api<=23 as well as 23<api<26 for which the spec differs.
private final AndroidApiLevel minApi = AndroidApiLevel.B;
- private final AndroidApiLevel targetApi = AndroidApiLevel.T;
+ private final AndroidApiLevel targetApi = AndroidApiLevel.MASTER;
private Set<String> getMissingGenericTypeConversions() {
HashSet<String> missing = new HashSet<>(MISSING_GENERIC_TYPE_CONVERSION);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
new file mode 100644
index 0000000..0b8c8d4
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
@@ -0,0 +1,92 @@
+// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdk11;
+
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_MINIMAL;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestBuilder;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class StackWalkerTest extends DesugaredLibraryTestBase {
+
+ private final TestParameters parameters;
+ private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+ private final CompilationSpecification compilationSpecification;
+
+ private static final Path INPUT_JAR =
+ Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stackwalker.jar");
+ private static final String EXPECTED_OUTPUT =
+ StringUtils.lines("[main]", "[frame2, frame1, main]");
+ private static final String MAIN_CLASS = "stackwalker.Example";
+
+ @Parameters(name = "{0}, spec: {1}, {2}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters().withDexRuntime(Version.MASTER).withAllApiLevels().build(),
+ ImmutableList.of(JDK11_MINIMAL, JDK11, JDK11_PATH),
+ DEFAULT_SPECIFICATIONS);
+ }
+
+ public StackWalkerTest(
+ TestParameters parameters,
+ LibraryDesugaringSpecification libraryDesugaringSpecification,
+ CompilationSpecification compilationSpecification) {
+ this.parameters = parameters;
+ this.libraryDesugaringSpecification = libraryDesugaringSpecification;
+ this.compilationSpecification = compilationSpecification;
+ }
+
+ @Test
+ public void testReference() throws Exception {
+ Assume.assumeTrue(
+ "Run only once",
+ compilationSpecification == D8_L8DEBUG && libraryDesugaringSpecification == JDK11);
+ // No desugared library, this should work.
+ testForD8()
+ .setMinApi(parameters.getApiLevel())
+ .addProgramFiles(INPUT_JAR)
+ .run(parameters.getRuntime(), MAIN_CLASS)
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ }
+
+ @Test
+ public void testDesugaredLibrary() throws Throwable {
+ Assume.assumeTrue(
+ "TODO(b/242948951): Issue with maintain type on function",
+ !compilationSpecification.isL8Shrink());
+ testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
+ .addProgramFiles(INPUT_JAR)
+ .addKeepMainRule(MAIN_CLASS)
+ .overrideLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.MASTER))
+ // Missing class java.lang.StackWalker$StackFrame.
+ .addOptionsModification(opt -> opt.ignoreMissingClasses = true)
+ .applyIf(
+ libraryDesugaringSpecification != JDK11_MINIMAL,
+ DesugaredLibraryTestBuilder::allowDiagnosticWarningMessages)
+ .run(parameters.getRuntime(), MAIN_CLASS)
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java
index 56bfcd6..0d44dc3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StreamCollectorCharacteristicsTest.java
@@ -51,7 +51,7 @@
}
@Test
- public void test() throws Exception {
+ public void test() throws Throwable {
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addProgramClasses(TestClass.class)
.addKeepMainRule(TestClass.class)