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()
+        '''
+    }
 }

Reply via email to