You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (JIRA)" <ji...@apache.org> on 2018/08/26 01:21:00 UTC
[jira] [Resolved] (GROOVY-8757) Incorrect bytecode produced after
compiling class implementing trait with generic method
[ https://issues.apache.org/jira/browse/GROOVY-8757?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Paul King resolved GROOVY-8757.
-------------------------------
Resolution: Fixed
Fix Version/s: 2.5.3
3.0.0-alpha-4
2.4.16
Proposed PR merged. Thanks for spotting the issue.
> Incorrect bytecode produced after compiling class implementing trait with generic method
> ----------------------------------------------------------------------------------------
>
> Key: GROOVY-8757
> URL: https://issues.apache.org/jira/browse/GROOVY-8757
> Project: Groovy
> Issue Type: Bug
> Components: Compiler
> Affects Versions: 2.4.15, 3.0.0-alpha-3, 2.5.2
> Reporter: Daniil Ovchinnikov
> Assignee: Paul King
> Priority: Critical
> Fix For: 2.4.16, 3.0.0-alpha-4, 2.5.3
>
>
> {code:java|title=T.groovy}
> trait T {
> def <T extends Number> T foo(Class<T> c) {
> println c
> return null
> }
> }
> {code}
> {code:java|title=C.groovy}
> class C implements T {}
> {code}
> {code:java|title=usage.groovy}
> new C().foo(Integer)
> {code}
> {noformat}
> $ groovyc C.groovy T.groovy
> $ groovy usage.groovy
> class java.lang.Integer
> $ groovyc C.groovy # recompile C using already compiled T
> $ groovy usage.groovy
> Caught: java.lang.VerifyError: Bad return type
> Exception Details:
> Location:
> C.foo(Ljava/lang/Class;)Ljava/lang/Number; @5: areturn
> Reason:
> Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/lang/Number' (from method signature)
> Current Frame:
> bci: @5
> flags: { }
> locals: { 'C', 'java/lang/Class' }
> stack: { 'java/lang/Object' }
> Bytecode:
> 0x0000000: 2a2b b600 88b0
> java.lang.VerifyError: Bad return type
> Exception Details:
> Location:
> C.foo(Ljava/lang/Class;)Ljava/lang/Number; @5: areturn
> Reason:
> Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/lang/Number' (from method signature)
> Current Frame:
> bci: @5
> flags: { }
> locals: { 'C', 'java/lang/Class' }
> stack: { 'java/lang/Object' }
> Bytecode:
> 0x0000000: 2a2b b600 88b0
> at usage.run(usage.groovy:1)
> {noformat}
> {noformat:title=original javap output}
> public class C implements T,groovy.lang.GroovyObject {
> public static transient boolean __$stMC;
> public C();
> public <T extends java.lang.Number> T foo(java.lang.Class<T>);
> public <T extends java.lang.Number> T Ttrait$super$foo(java.lang.Class<T>);
> static {};
> protected groovy.lang.MetaClass $getStaticMetaClass();
> public groovy.lang.MetaClass getMetaClass();
> public void setMetaClass(groovy.lang.MetaClass);
> public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
> public java.lang.Object getProperty(java.lang.String);
> public void setProperty(java.lang.String, java.lang.Object);
> }
> {noformat}
> {noformat:title=recompiled javap output}
> public class C implements T,groovy.lang.GroovyObject {
> public static transient boolean __$stMC;
> public C();
> public <T> T foo(java.lang.Class<T>);
> public <T extends java.lang.Number> T Ttrait$super$foo(java.lang.Class<T>);
> static {};
> protected groovy.lang.MetaClass $getStaticMetaClass();
> public groovy.lang.MetaClass getMetaClass();
> public void setMetaClass(groovy.lang.MetaClass);
> public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
> public java.lang.Object getProperty(java.lang.String);
> public void setProperty(java.lang.String, java.lang.Object);
> public java.lang.Number foo(java.lang.Class);
> }
> {noformat}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)