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)

Reply via email to