groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (GROOVY-7926) Method that returns void in a Trait with generics produces questionable byte code
Date Fri, 09 Sep 2016 18:38:20 GMT

    [ https://issues.apache.org/jira/browse/GROOVY-7926?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15477920#comment-15477920
] 

ASF GitHub Bot commented on GROOVY-7926:
----------------------------------------

Github user jwagenleitner commented on a diff in the pull request:

    https://github.com/apache/groovy/pull/416#discussion_r78228482
  
    --- Diff: src/main/org/codehaus/groovy/transform/trait/TraitComposer.java ---
    @@ -293,7 +293,8 @@ private static void createForwarderMethod(
     
             ClassNode[] exceptionNodes = correctToGenericsSpecRecurse(genericsSpec, copyExceptions(helperMethod.getExceptions()));
             ClassNode fixedReturnType = correctToGenericsSpecRecurse(genericsSpec, helperMethod.getReturnType());
    -        Expression forwardExpression = genericsSpec.isEmpty()?mce:new CastExpression(fixedReturnType,mce);
    +        boolean noCastRequired = genericsSpec.isEmpty() || fixedReturnType.getName().equals(ClassHelper.VOID_TYPE.getName());
    --- End diff --
    
    Thanks for the explanation.


> 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)

Mime
View raw message