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)