Skip to content

Commit 8a574a2

Browse files
committed
Prevent StackOverflowError with thrown type variables
1 parent b84d7e6 commit 8a574a2

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/javac/dom/JavacMethodBinding.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -501,13 +501,17 @@ static void getKey(StringBuilder builder, MethodSymbol methodSymbol, ExecutableT
501501
} else if (!(methodSymbol.getReturnType() instanceof JCNoType)) {
502502
JavacTypeBinding.getKey(builder, methodSymbol.getReturnType(), false, true, true, resolver);
503503
}
504-
if (methodType != null) {
504+
if (methodType != null && methodType.getThrownTypes() != null) {
505505
methodType.getThrownTypes().stream()
506506
.map(Type.class::cast)
507-
.map(resolver.bindings::getTypeBinding)
508-
.map(JavacTypeBinding::getKey)
509-
.map(k -> "|" + k) // key wants "|", signature wants "^"
510-
.forEach(builder::append);
507+
.forEach(param -> {
508+
builder.append("|"); // key wants "|", signature wants "^"
509+
try {
510+
JavacTypeBinding.getKey(builder, param, false, true, true, resolver);
511+
} catch (BindingKeyException ex) {
512+
ILog.get().error(ex.getMessage(), ex);
513+
}
514+
});
511515
}
512516
}
513517
}

org.eclipse.jdt.core.tests.javac/src/org/eclipse/jdt/core/tests/javac/JavacSpecificConverterTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import org.eclipse.jdt.core.dom.CompilationUnit;
2323
import org.eclipse.jdt.core.dom.FieldDeclaration;
2424
import org.eclipse.jdt.core.dom.Javadoc;
25+
import org.eclipse.jdt.core.dom.MethodDeclaration;
2526
import org.eclipse.jdt.core.dom.ModuleDeclaration;
27+
import org.eclipse.jdt.core.dom.NodeFinder;
2628
import org.eclipse.jdt.core.dom.TagElement;
2729
import org.eclipse.jdt.core.dom.TypeDeclaration;
2830
import org.junit.Test;
@@ -73,4 +75,22 @@ public boolean visit(ModuleDeclaration node) {
7375
}
7476
});
7577
}
78+
79+
@Test
80+
public void testInfiniteLoopParameterizedMethodKey() throws Exception {
81+
ASTParser parser = ASTParser.newParser(AST.getJLSLatest());
82+
String source = """
83+
public class A {
84+
public <E extends Exception> void m() throws E {
85+
}
86+
}
87+
""";
88+
parser.setSource(source.toCharArray());
89+
parser.setUnitName("A.java");
90+
parser.setEnvironment(null, null, null, true);
91+
parser.setResolveBindings(true);
92+
ASTNode node = parser.createAST(new NullProgressMonitor());
93+
MethodDeclaration meth = (MethodDeclaration) NodeFinder.perform(node, source.indexOf("m()"), 0).getParent();
94+
assertEquals("LA;.m<E:Ljava/lang/Exception;>()V|TE;", meth.resolveBinding().getKey());
95+
}
7696
}

0 commit comments

Comments
 (0)