From 4fe9c8c50c50f82a072d1930e2774bd9b22087d3 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Apr 2010 16:16:42 +0100 Subject: [PATCH] fixing possible stack overflow in case of a cyclic constructor invocation in groovy code --- .../compiler/generator/GroovyToJavaGenerator.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java index a13aeb826140..19749946b1b5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java @@ -559,7 +559,7 @@ public class GroovyToJavaGenerator { text.append(") "); - final Set throwsTypes = collectThrowsTypes(constructor); + final Set throwsTypes = collectThrowsTypes(constructor, new THashSet()); if (!throwsTypes.isEmpty()) { text.append("throws ").append(StringUtil.join(throwsTypes, ", ")).append(" "); } @@ -581,24 +581,28 @@ public class GroovyToJavaGenerator { text.append("\n }\n"); } - private static Set collectThrowsTypes(GrConstructor constructor) { + private static Set collectThrowsTypes(GrConstructor constructor, Set visited) { final GroovyResolveResult resolveResult = resolveChainingConstructor(constructor); if (resolveResult == null) { return Collections.emptySet(); } - final Set result = CollectionFactory.newTroveSet(); final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); final PsiMethod chainedConstructor = (PsiMethod)resolveResult.getElement(); assert chainedConstructor != null; + if (!visited.add(chainedConstructor)) { + return Collections.emptySet(); + } + + final Set result = CollectionFactory.newTroveSet(); for (PsiClassType type : chainedConstructor.getThrowsList().getReferencedTypes()) { result.add(getTypeText(substitutor.substitute(type), null, false)); } if (chainedConstructor instanceof GrConstructor) { - result.addAll(collectThrowsTypes((GrConstructor)chainedConstructor)); + result.addAll(collectThrowsTypes((GrConstructor)chainedConstructor, visited)); } return result; } -- 2.32.0