This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_2_5_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 535a08684bf51379d5c79310dd775e8c21771ed3 Author: Eric Milles <[email protected]> AuthorDate: Sat Dec 18 10:56:39 2021 -0600 GROOVY-10424: SC: prevent infinite recursion for `isExtended(ClassNode)` --- .../transformers/BooleanExpressionTransformer.java | 10 +++--- src/test/groovy/transform/stc/BugsSTCTest.groovy | 36 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BooleanExpressionTransformer.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BooleanExpressionTransformer.java index 146be81..851dd06 100644 --- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BooleanExpressionTransformer.java +++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BooleanExpressionTransformer.java @@ -76,14 +76,12 @@ public class BooleanExpressionTransformer { } return transformer.superTransform(booleanExpression); } - + private static boolean isExtended(ClassNode owner, Iterator<InnerClassNode> classes) { while (classes.hasNext()) { - InnerClassNode next = classes.next(); + InnerClassNode next = classes.next(); if (next!=owner && next.isDerivedFrom(owner)) return true; - } - if (owner.getInnerClasses().hasNext()) { - return isExtended(owner, owner.getInnerClasses()); + if (isExtended(owner,next.getInnerClasses())) return true; } return false; } @@ -203,4 +201,4 @@ public class BooleanExpressionTransformer { } } } -} \ No newline at end of file +} diff --git a/src/test/groovy/transform/stc/BugsSTCTest.groovy b/src/test/groovy/transform/stc/BugsSTCTest.groovy index 6635e0b..bbfa7db 100644 --- a/src/test/groovy/transform/stc/BugsSTCTest.groovy +++ b/src/test/groovy/transform/stc/BugsSTCTest.groovy @@ -914,4 +914,40 @@ Printer } ''' } + + // GROOVY-10424 + void testPrivateInnerClassOptimizedBooleanExpr1() { + assertScript ''' + class Outer { + private static class Inner { + private Inner() {} // triggers creation of Inner$1 in StaticCompilationVisitor$addPrivateBridgeMethods + } + void test() { + def inner = new Inner() + if (inner) { // optimized boolean expression; StackOverflowError + assert true + } + } + } + new Outer().test() + ''' + } + + // GROOVY-10424 + void testPrivateInnerClassOptimizedBooleanExpr2() { + assertScript ''' + class Outer { + private static class Inner { + static class Three {} + } + void test() { + def inner = new Inner() + if (inner) { // optimized boolean expression; StackOverflowError + assert true + } + } + } + new Outer().test() + ''' + } }
