You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniil Ovchinnikov (JIRA)" <ji...@apache.org> on 2018/08/20 17:23:00 UTC

[jira] [Created] (GROOVY-8757) Incorrect bytecode produced after compiling class implementing trait with generic method

Daniil Ovchinnikov created GROOVY-8757:
------------------------------------------

             Summary: 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: 3.0.0-alpha-3, 2.4.15
            Reporter: Daniil Ovchinnikov


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