You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/02/23 19:47:08 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-10424: SC: prevent infinite recursion for `isExtended(ClassNode)`

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new 7fcc09f  GROOVY-10424: SC: prevent infinite recursion for `isExtended(ClassNode)`
7fcc09f is described below

commit 7fcc09f2fc6385b7dab08f06ddef8e10e0482641
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Dec 18 10:56:39 2021 -0600

    GROOVY-10424: SC: prevent infinite recursion for `isExtended(ClassNode)`
    
    Conflicts:
    	src/main/java/org/codehaus/groovy/transform/sc/transformers/BooleanExpressionTransformer.java
---
 .../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 575c532..f15b75c 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
@@ -71,14 +71,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;
     }
@@ -180,4 +178,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 cfa8c19..bbd13bd 100644
--- a/src/test/groovy/transform/stc/BugsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/BugsSTCTest.groovy
@@ -1035,4 +1035,40 @@ Printer
             assert obj.proper == 'value'
         '''
     }
+
+    // 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()
+        '''
+    }
 }