You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Ryan Tandy (Jira)" <ji...@apache.org> on 2021/02/06 01:31:00 UTC

[jira] [Created] (GROOVY-9930) Groovy 3.0.7 miscompiles methods with default arguments for targetBytecode 1.5 or 1.6

Ryan Tandy created GROOVY-9930:
----------------------------------

             Summary: Groovy 3.0.7 miscompiles methods with default arguments for targetBytecode 1.5 or 1.6
                 Key: GROOVY-9930
                 URL: https://issues.apache.org/jira/browse/GROOVY-9930
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 3.0.7
            Reporter: Ryan Tandy


Regression in 3.0.7: When targetBytecode is set to 1.5 or 1.6, Groovy generates invalid bytecode for methods with default arguments.

{noformat}
$ cat test.groovy
String method(String arg1, String arg2 = '') {
    return null
}
$ ./groovy-3.0.7/bin/groovy test.groovy
$ echo $?
0
$ echo 'configuration.targetBytecode = "1.5"' > configscript.groovy
$ ./groovy-3.0.7/bin/groovy --configscript configscript.groovy test.groovy
Caught: java.lang.VerifyError: (class: test, method: method signature: (Ljava/lang/String;)Ljava/lang/String;) Illegal target of jump or branch
java.lang.VerifyError: (class: test, method: method signature: (Ljava/lang/String;)Ljava/lang/String;) Illegal target of jump or branch
$ echo 'configuration.targetBytecode = "1.6"' > configscript.groovy
$ ./groovy-3.0.7/bin/groovy --configscript configscript.groovy test.groovy
Exception Details:
  Location:
    test.run()Ljava/lang/Object; @6: aconst_null
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: b800 0f4c 01b0 01b0                    

java.lang.VerifyError: Expecting a stack map frame
Exception Details:
  Location:
    test.run()Ljava/lang/Object; @6: aconst_null
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: b800 0f4c 01b0 01b0
{noformat}

I have not bisected, but I suspect [6292f785|https://github.com/apache/groovy/commit/6292f7852a] for at least the 1.5 case. It looks like the static metaclass check generates a goto with an offset that previously pointed at the "unused" insns but now points past the end of the method.

(My project targets Java 8, but our build system -- running a very old version of gmavenplus -- was unintentionally compiling for 1.5. Upgrading gmavenplus fixed that, so I'm not actually affected by this, but it seemed worth reporting.)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)