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

[jira] [Created] (GROOVY-8819) java.lang.VerifyError when calling this() with static final field from a super class

Keith Suderman created GROOVY-8819:
--------------------------------------

             Summary: java.lang.VerifyError when calling this() with static final field from a super class
                 Key: GROOVY-8819
                 URL: https://issues.apache.org/jira/browse/GROOVY-8819
             Project: Groovy
          Issue Type: Bug
          Components: Compiler
    Affects Versions: 2.5.2, 2.4.x
            Reporter: Keith Suderman


If a constructor attempts to call _this(X)_, where _X_ is a _static final_ field defined in a super class a _java.lang.VerifyError_ is thrown at runtime . This only occurs if _X_ is not qualified with the super class name.

{code:java|title=Parent.java|borderStyle=solid}
class Parent { 
	static final String DEFAULT = 'default' 
}
{code}
{code:java|title=Child.java|borderStyle=solid}
class Child extends Parent {
	String value
	Child() { this(DEFAULT) }  // <-- here
	Child(String value) { this.value = value }
}
{code}
{noformat:title=java.lang.VerifyError}
 Caught: java.lang.VerifyError: Bad type on operand stack
 Exception Details:
 Location:
 Child.<init>()V @10: invokeinterface
 Reason:
 Type uninitializedThis (current frame, stack[2]) is not assignable to 'java/lang/Object'
 Current Frame:
 bci: @10
 flags: \{ flagThisUninit }
 locals: \{ uninitializedThis, '[Lorg/codehaus/groovy/runtime/callsite/CallSite;' }
 stack: \{ uninitializedThis, 'org/codehaus/groovy/runtime/callsite/CallSite', uninitializedThis }
 Bytecode:
 0x0000000: b800 114c 2a2b 1212 322a b900 1802 00b8
 0x0000010: 001e c000 20b7 0023 b1 
{noformat}

*Workaround*

Simply ensure that references to static final fields from the super class are qualified with the super class name.

{code:java|title=Child.java|borderStyle=solid}
class Child extends Parent {
	String value
	Child() { this(Parent.DEFAULT) }  // ok
	Child(String value) { this.value = value }
}
{code}




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)