> 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

Reply via email to