[squeak-dev] Bug in EncoderForSistaV1
marcel.taeumel
Marcel.Taeumel at hpi.de
Wed Jul 3 10:37:52 UTC 2019
Maybe the bug is in CompiledMethod >> #readsField:? It might have to traverse
CompiledBlock in literals? Same for #writesField:? If so, I might be able to
fix that...
Best,
Marcel
marcel.taeumel wrote
> Hi, there.
>
> The encoder for Sista cannot tell about references to instance variables
> that are behind compiled blocks.
>
> Object subclass: #MyExampleClass
> instanceVariableNames: 'field'
> ...
> MyExampleClass >> #foobar
> ^ [field] value
>
> This is the problem:
>
> (MyExampleClass >> #foobar) readsField: 1. "false"
>
> Works fine if:
>
> MyExampleClass >> #foobar
> ^ field
>
> I don't feel able to fix that bug here:
>
> EncoderForSistaV1 >> instVarReadScanBlockFor: varIndexCode using: scanner
> "Answer a block argument for InstructionStream>>scanFor: that answers true
> for reads of the inst var with zero-relative index varIndexCode.
> N.B. Don't assume the compiler uses the most compact encoding available."
>
> " 0-15 0000 i i i i Push Receiver Variable #iiii
> * 224 11100000 aaaaaaaa Extend A (Ext A = Ext A prev * 256 + Ext A)
> * 226 11100010 i i i i i i i i Push Receiver Variable #iiiiiiii (+ Extend
> A * 256)"
> | extension |
> extension := 0.
> ^[:b| | prevext |
> prevext := extension.
> extension := b = 224 ifTrue: [scanner followingByte bitShift: 8]
> ifFalse: [0].
> (b < 16 and: [b = varIndexCode])
> or: [b = 226
> and: [scanner followingByte + prevext = varIndexCode]]]
>
> Volunteers? :-)
>
> Best,
> Marcel
--
Sent from: http://forum.world.st/Squeak-Dev-f45488.html
More information about the Squeak-dev
mailing list
|