Paul, > On 5 Jun 2020, at 15:11, Paul King <pa...@asert.com.au> wrote: > We should never throw a VerifyError, so that is a bug.
OK, I'll create an issue for that, or will you? (I guess you'd be able to describe it much better than me.) > But you probably don't want to use "this" in a static context. You probably > just want $q.metaClass or ${getMetaClass()}. Well they do work, but I believe Groovy, unlike Java, should support static this properly, thus in a q's static method q.whatever and this.whatever should be always precisely the same[1]. And for readability and robustness (e.g., when the code is copied to another class), I would strongly prefer the latter. Am I wrong, do I miss something here? And as for the other issue > You can make _objects protected to overcome the MPE or use a local variable, > e.g.: > def localVar = _objects > 1.times { localVar << it } Thanks, of both these work-arounds I happen to know; my question is whether the problem with private fields is the intended behaviour (in which case I must admit I have missed it in closure documentation), or whether it is a bug which I should report :) Thanks a lot! OC [1] Agreed, using this might lead someone who is used to an object-oriented language like Ruby or Smalltalk to believe that it would work properly when inherited, but it would not, for Java's at best half-OO, half-C++-like-crap. But that's beside the point here :) > > Cheers, Paul. > > > On Fri, Jun 5, 2020 at 9:33 PM OCsite <o...@ocs.cz <mailto:o...@ocs.cz>> > wrote: > And another thing which I don't understand and seems highly suspicious — do I > just miss something of importance, or is it a bug? > > === > 127 ocs /tmp> <q.groovy > class q { > static main(av) { > println "my MC is $this.metaClass" > } > } > 128 ocs /tmp> /usr/local/groovy-3.0.4/bin/groovy q > Caught: java.lang.VerifyError: Bad type on operand stack > Exception Details: > Location: > q.main([Ljava/lang/String;)V @21: getfield > Reason: > Type '[Ljava/lang/String;' (current frame, stack[7]) is not assignable to > 'q' > Current Frame: > bci: @21 > flags: { } > locals: { '[Ljava/lang/String;', > '[Lorg/codehaus/groovy/runtime/callsite/CallSite;' } > stack: { 'org/codehaus/groovy/runtime/callsite/CallSite', > 'java/lang/Class', uninitialized 10, uninitialized 10, '[Ljava/lang/Object;', > '[Ljava/lang/Object;', integer, '[Ljava/lang/String;' } > Bytecode: > 0000000: b800 144c 2b12 2132 1202 bb00 2359 04bd > 0000010: 0004 5903 2ab4 001c 5305 bd00 2559 0312 > 0000020: 2753 5904 1229 53b7 002c b900 3203 0057 > 0000030: b1 > > java.lang.VerifyError: Bad type on operand stack > Exception Details: > Location: > q.main([Ljava/lang/String;)V @21: getfield > Reason: > Type '[Ljava/lang/String;' (current frame, stack[7]) is not assignable to > 'q' > Current Frame: > bci: @21 > flags: { } > locals: { '[Ljava/lang/String;', > '[Lorg/codehaus/groovy/runtime/callsite/CallSite;' } > stack: { 'org/codehaus/groovy/runtime/callsite/CallSite', > 'java/lang/Class', uninitialized 10, uninitialized 10, '[Ljava/lang/Object;', > '[Ljava/lang/Object;', integer, '[Ljava/lang/String;' } > Bytecode: > 0000000: b800 144c 2b12 2132 1202 bb00 2359 04bd > 0000010: 0004 5903 2ab4 001c 5305 bd00 2559 0312 > 0000020: 2753 5904 1229 53b7 002c b900 3203 0057 > 0000030: b1 > > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > 129 ocs /tmp> > === > >> On 27 May 2020, at 23:42, o...@ocs.cz <mailto:o...@ocs.cz> wrote: >> >> 484 ocs /tmp> <q.groovy >> class q { >> static main(av) { >> new Foo().test() >> } >> } >> class Foo extends Root { } >> class Root { >> private _objects=[] >> void test() { >> println "this is OK" >> _objects<<'hi' >> println "this crashes" >> 1.times { _objects<<it } >> } >> } >> 485 ocs /tmp> /usr/local/groovy-3.0.4/bin/groovy q >> this is OK >> this crashes >> Caught: groovy.lang.MissingPropertyException: No such property: _objects for >> class: Foo >> groovy.lang.MissingPropertyException: No such property: _objects for class: >> Foo >> at Root$_test_closure1.doCall(q.groovy:13) >> at Root.test(q.groovy:13) >> at Root$test.call(Unknown Source) >> at q.main(q.groovy:3) >> 486 ocs /tmp> >> >