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