Graeme Rocher created GROOVY-7926:
-------------------------------------

             Summary: Method that returns void in a Trait with generics 
produces questionable byte code
                 Key: GROOVY-7926
                 URL: https://issues.apache.org/jira/browse/GROOVY-7926
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 2.4.7
            Reporter: Graeme Rocher


Given the following trait:

{code}
trait MyTrait<D> {
    void delete() {
        // no-op
    }
}
class MyImpl implements MyTrait<MyImpl> {
}
{code}

The delete method produces byte code that when decompiled looks like:

{code}
    public void delete() {
        CallSite[] var1 = $getCallSiteArray();
        void var10000 = (void)var1[1].call(Helper.class, this);
    }
{code}

As you can see "void" is used as a type of a variable. This results in the 
following exception on the IBM JVM (it works fine in Oracle and OpenJDK):

{code}
Caused by: java.lang.NoClassDefFoundError: void
        at it.dedagroup.Test.delete(Test.groovy)
        at org.grails.datastore.gorm.GormEntity$delete$0.call(Unknown Source)
        at 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
{code}

Since the issue occurs only in IBM JVM it could be argued that this is a 
problem with that JVM, however the byte code produced does seem suspicious to 
me as "void" cannot be used as a type of a local variable. Thoughts?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to