> On 19 Feb 2015, at 10:45, Marcus Denker <marcus.den...@inria.fr> wrote: > >> >> -> generate better byte code, the reflective read is of course slow. > > > this is easy. What we need to do is to override #emitValue: and #emitStore: > > emitValue: methodBuilder > > methodBuilder > pushInstVar: baseSlot index; > pushLiteral: self name; > pushLiteral: nil; > send: #at:ifAbsent: > > for storing, the problem is that the value to be saved is on top of the > stack. so > we need to first save it and pop it off to be able to use #at:put:: > > emitStore: methodBuilder > | tempName | > > tempName := ('0generated_',self name) asSymbol. > > methodBuilder > addTemp: tempName; > storeTemp: tempName; > popTop; > pushInstVar: baseSlot index; > pushLiteral: self name; > pushTemp: tempName; > send: #at:put: > > committed. https://pharo.fogbugz.com/f/cases/14962/emit-bytecode-for-PropertySlot-improve-generated-code-for-reflective-write-for-Slots-and-Globals
This in addition uses the same trick of the temp to not need a writeToSlot:of: method in object for the default code generated for reflective write of slots. Marcus