Skip to content

Commit 9d99e20

Browse files
committed
Traverse all methods in lambda class for stable name
1 parent c75ffbb commit 9d99e20

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/LambdaUtils.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232

3333
import java.util.ArrayList;
3434
import java.util.Arrays;
35+
import java.util.HashSet;
3536
import java.util.List;
37+
import java.util.Set;
3638
import java.util.regex.Matcher;
3739
import java.util.regex.Pattern;
3840

@@ -79,10 +81,15 @@ private LambdaUtils() {
7981
public static String findStableLambdaName(ResolvedJavaType lambdaType) {
8082
ResolvedJavaMethod[] lambdaProxyMethods = Arrays.stream(lambdaType.getDeclaredMethods(false)).filter(m -> !m.isBridge() && m.isPublic()).toArray(ResolvedJavaMethod[]::new);
8183
/*
82-
* Take only the first method to find invoked methods, because the result would be the same
83-
* for all other methods.
84+
* Traverse all methods in lambda class for invokes because it is possible a javaagent may
85+
* inject new methods into the lambda class. For example, Byte-buddy used by OTele can
86+
* transform all classes that implements {@link java.util.concurrent.Callable} by injecting
87+
* new methods that may not have any invokes.
8488
*/
85-
List<JavaMethod> invokedMethods = findInvokedMethods(lambdaProxyMethods[0]);
89+
Set<JavaMethod> invokedMethods = new HashSet<>();
90+
for (int i = 0; i < lambdaProxyMethods.length; i++) {
91+
invokedMethods.addAll(findInvokedMethods(lambdaProxyMethods[i]));
92+
}
8693
if (invokedMethods.isEmpty()) {
8794
StringBuilder sb = new StringBuilder();
8895
sb.append("Lambda without a target invoke: ").append(lambdaType.toClassName());
@@ -141,7 +148,7 @@ public static boolean isLambdaName(String name) {
141148
return isLambdaClassName(name) && lambdaMatcher(name).find();
142149
}
143150

144-
private static String createStableLambdaName(ResolvedJavaType lambdaType, List<JavaMethod> targetMethods) {
151+
private static String createStableLambdaName(ResolvedJavaType lambdaType, Set<JavaMethod> targetMethods) {
145152
final String lambdaName = lambdaType.getName();
146153
assert lambdaMatcher(lambdaName).find() : "Stable name should be created for lambda types: " + lambdaName;
147154

0 commit comments

Comments
 (0)