Sterling Greene created GROOVY-11379:
----------------------------------------
Summary: Use of findAll produces NoSuchMethodError when compiling
with Groovy 3.0.21 and running on an older version
Key: GROOVY-11379
URL: https://issues.apache.org/jira/browse/GROOVY-11379
Project: Groovy
Issue Type: Bug
Components: groovy-runtime
Affects Versions: 3.0.12
Reporter: Sterling Greene
This was reported as a regression in Gradle, but I've reduced it down to
something in Groovy.
Given this class:
{code}
@groovy.transform.CompileStatic
class Main {
static void main(String[] args) {
println "example".split("m").findAll { true }.collect()
}
}
{code}
If this is compiled with Groovy 3.0.21 and then run with Groovy before 3.0.21
(tried 3.0.17 and 3.0.20), you'll get a NoSuchMethodError:
{quote}
java.lang.NoSuchMethodError: 'java.util.List
org.codehaus.groovy.runtime.DefaultGroovyMethods.findAll(java.lang.Object[],
groovy.lang.Closure)'
at Main.main(Main.groovy:4)
{quote}
This might be related to the backport of GROOVY-7001:
https://github.com/apache/groovy/commit/d9fbe95b47c16502952c1844febd11e789ab8bb4
I'm not sure if findAll is the only method affected. Compiling with 3.0.20 and
running with 3.0.21 works.
The bytecode produced with 3.0.21 definitely has a reference to the missing
method:
{noformat}
public static void main(java.lang.String...);
Code:
0: ldc #2 // class Main
2: ldc #30 // String example
4: ldc #32 // String m
6: invokevirtual #38 // Method
java/lang/String.split:(Ljava/lang/String;)[Ljava/lang/String;
9: new #40 // class Main$_main_closure1
12: dup
13: ldc #2 // class Main
15: ldc #2 // class Main
17: invokespecial #43 // Method
Main$_main_closure1."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
20: invokestatic #49 // Method
org/codehaus/groovy/runtime/DefaultGroovyMethods.findAll:([Ljava/lang/Object;Lgroovy/lang/Closure;)Ljava/util/List;
23: invokestatic #53 // Method
org/codehaus/groovy/runtime/DefaultGroovyMethods.collect:(Ljava/lang/Iterable;)Ljava/util/List;
26: invokestatic #56 // Method
org/codehaus/groovy/runtime/DefaultGroovyMethods.println:(Ljava/lang/Object;Ljava/lang/Object;)V
29: aconst_null
30: pop
31: return
{noformat}
The same code built with 3.0.20 produces:
{noformat}
public static void main(java.lang.String...);
Code:
0: ldc #2 // class Main
2: ldc #30 // String example
4: ldc #32 // String m
6: invokevirtual #38 // Method
java/lang/String.split:(Ljava/lang/String;)[Ljava/lang/String;
9: ldc #40 // class "[Ljava/lang/Object;"
11: invokestatic #46 // Method
org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
14: checkcast #40 // class "[Ljava/lang/Object;"
17: new #48 // class Main$_main_closure1
20: dup
21: ldc #2 // class Main
23: ldc #2 // class Main
25: invokespecial #51 // Method
Main$_main_closure1."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
28: invokestatic #57 // Method
org/codehaus/groovy/runtime/DefaultGroovyMethods.findAll:([Ljava/lang/Object;Lgroovy/lang/Closure;)Ljava/util/Collection;
31: invokestatic #61 // Method
org/codehaus/groovy/runtime/DefaultGroovyMethods.collect:(Ljava/lang/Iterable;)Ljava/util/List;
34: invokestatic #64 // Method
org/codehaus/groovy/runtime/DefaultGroovyMethods.println:(Ljava/lang/Object;Ljava/lang/Object;)V
37: aconst_null
38: pop
39: return
{noformat}
Note that the return type is different for findAll.
I didn't check if this affected 4.x or 5.x in some way.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)