[ https://issues.apache.org/jira/browse/GROOVY-11379?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17847110#comment-17847110 ]
Sterling Greene commented on GROOVY-11379: ------------------------------------------ Do the new methods make it easier/more likely for Groovy 3 compiled classes to work with Groovy 4/5? > 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 > Priority: Major > > 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)