groovy-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Keith Suderman <suder...@cs.vassar.edu>
Subject Bug or expected behaviour?
Date Sat, 29 Sep 2018 20:35:21 GMT
Hello,

I have a parent class that defines a static final String and a child class that references
the String in it's constructor.  Essentially:

class Parent {
	static final String DEFAULT = 'default'
}
class Child extends Parent {
	String value
	Child() { this(DEFAULT) }  // Bad type on operand stack
	Child(String value) { this.value = value }
}
println new Child().value

However, when I try to run the code I get a "java.lang.VerifyError: Bad type on operand stack"
(see below).  From my understanding this exception is caused when a constructor tries to use
a variable/field that has not been initialized yet; i.e. the `this(DEFAULT)` in the above
example.  However, if I qualify the DEFAULT with the class name (i.e. `this(Parent.DEFAULT)`)
the code works as expected.

Similar code in Java works without DEFAULT being qualified with the superclass name.  So I
am wondering; is this a bug or a design decision that was made somewhere/sometime?

I am using Groovy Version: 2.5.2 JVM: 1.8.0_40 Vendor: Oracle Corporation OS: Mac OS X

Cheers,
Keith

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

----------------------
Keith Suderman
Research Associate
Department of Computer Science
Vassar College, Poughkeepsie NY
suderman@cs.vassar.edu





Mime
View raw message