Oops. Find fix attached: LiteralVariableNode methods for code generation (new scheme) sizeCodeForStorePop: encoder self reserve: encoder. ^(key isVariableBinding and: [key isSpecialWriteBinding]) ifTrue: [(self sizeCodeForStore: encoder) + encoder sizePop] ifFalse: [encoder sizeStorePopLiteralVar: index] Arguably the compiler should issue an error, but the error is raised at run-time because the generated code sends value: (correct) rather than using any of the store lit var bytecodes. If a compiler error is wanted (my preference) then find attached: LiteralVariableNode methods for testing assignmentCheck: encoder at: location ^(key isVariableBinding and: [key isSpecialWriteBinding]) ifTrue: [location] ifFalse: [-1] On Thu, May 20, 2010 at 2:16 AM, Igor Stasenko <siguctua@gmail.com> wrote:
Open a browser, pick any class, and enter the code:
foo WorldState := nil
then accept it. The compiler goes into an infinite recursion in LiteralVariableNode>>sizeCodeForStorePop:.
sizeCodeForStorePop: encoder self reserve: encoder. ^(key isVariableBinding and: [key isSpecialWriteBinding]) ifTrue: [(self sizeCodeForStorePop: encoder) + encoder sizePop] ifFalse: [encoder sizeStorePopLiteralVar: index]
(Pharo 1.1 having no such problem - it accepts a code without any warnings.. )
AFAIK, it should either warn or throw an error that assignment is not possible into read-only variable binding.
-- Best regards, Igor Stasenko AKA sig.