You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Jason Winnebeck (JIRA)" <ji...@apache.org> on 2016/05/10 19:49:12 UTC

[jira] [Created] (GROOVY-7836) CompileStatic + static inner class + EqualsAndHashCode gives VerifyError in equals

Jason Winnebeck created GROOVY-7836:
---------------------------------------

             Summary: CompileStatic + static inner class + EqualsAndHashCode gives VerifyError in equals
                 Key: GROOVY-7836
                 URL: https://issues.apache.org/jira/browse/GROOVY-7836
             Project: Groovy
          Issue Type: Bug
          Components: Static compilation
    Affects Versions: 2.4.6
            Reporter: Jason Winnebeck


{code}
import groovy.transform.CompileStatic
import groovy.transform.EqualsAndHashCode

@CompileStatic
class Parent {
    List<Integer> getInts() { [0] }

    @EqualsAndHashCode
    static class Child {
        List<Integer> ints
    }
}

println GroovySystem.version
println new Parent.Child()
{code}

The key is the inner class having a property matching the parent's.

Result:

{code}
2.4.6
java.lang.VerifyError: (class: Parent$Child, method: equals signature: (Ljava/lang/Object;)Z) Incompatible object argument for function call
{code}

Inspecting the bytecode, I see the following:

{code}
   L13
    ALOAD 0
    INVOKEVIRTUAL Parent.getInts ()Ljava/util/List;
    ALOAD 2
    INVOKEVIRTUAL Parent$Child.getInts ()Ljava/util/List;
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.compareEqual (Ljava/lang/Object;Ljava/lang/Object;)Z
    IFNE L14
    ICONST_1
{code}

It appears that the bytecode is attempting to call a method on the outer class, even though the inner class is static and there is no reason to access the outer class.



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