[Vm-dev] Bug in #instVarAt:put: for read-only objects

Denis Kudriashov dionisiydk at gmail.com
Sat Jan 6 13:13:30 UTC 2018


Hi

2018-01-06 13:06 GMT+01:00 Norbert Hartl <norbert at hartl.name>:

> Am 05.01.2018 um 16:53 schrieb Clément Bera <bera.clement at gmail.com>:
>
> On Fri, Jan 5, 2018 at 4:05 PM, Norbert Hartl <norbert at hartl.name> wrote:
>
>>
>> You mean
>>
>> <primitive: 174 error: ec>
>> self isReadOnlyObject
>> ifTrue: [(ModificationForbidden for: self atInstVar: index with:
>> anObject) signal]
>> ifFalse: [ self primitiveFailed ]
>> ?
>>
>> Norbert
>>
>
> yes something like that.
>
>
> Same thing for Object>>#at:put:, floatAt:put: and so on.
>
>
> I’m working on it and came by
>
> Object>>#primitiveChangeClassTo:
>
> and I wonder what would be the approach here. The ModificationForbidden/NoModificationError
> seems to be tight to an index. What would be the case for a class change?
> Another Exception class?
>

In that case I would introduce hierarchy:

ModificationForbidden
   StateModificationForbidden
   ClassModificationForbidden


How is that solved in VW?
>
> Norbert
>
>
>
>>
>> Am 05.01.2018 um 14:22 schrieb Clément Bera <bera.clement at gmail.com>:
>>
>> Hi,
>>
>> No this is not a bug.
>>
>> This needs to be handled in the primitive failure code in the image, the
>> method should be something like that :
>>
>> Object>>instVarAt: index put: anObject
>> <primitive: 174 error: ec>
>>         self isReadOnlyObject ifTrue: [(ModificationForbidden for: self
>> atInstVar: index with: anObject) signal]
>> self primitiveFailed
>>
>> All primitive fall-back code triggering object mutation should be
>> rewritten this way, especially primitives such as #at:put:,
>> #instVarAt:put:, etc.
>>
>> Cheers
>>
>> On Fri, Jan 5, 2018 at 1:42 PM, Norbert Hartl <norbert at hartl.name> wrote:
>>
>>>
>>> If I do
>>>
>>> (#foo -> #bar)
>>> beReadOnlyObject;
>>> value: #baz
>>>
>>> it throws
>>>
>>> *ModificationForbidden:  #foo->#bar is read-only, hence its field 2
>>> cannot be modified with #baz*
>>>
>>>  which is as expected. But if I do
>>>
>>> (#foo -> #bar)
>>> beReadOnlyObject;
>>> instVarNamed: #value put: #baz
>>>
>>> I get
>>>
>>> *PrimitiveFailed: primitive #instVarAt:put: in Association failed*
>>>
>>> I think this a bug, no?
>>>
>>> Norbert
>>>
>>>
>>
>>
>> --
>> Clément Béra
>> Pharo consortium engineer
>> https://clementbera.wordpress.com/
>> Bâtiment B 40, avenue Halley 59650 Villeneuve d'Ascq
>>
>>
>>
>>
>
>
> --
> Clément Béra
> Pharo consortium engineer
> https://clementbera.wordpress.com/
> Bâtiment B 40, avenue Halley 59650 Villeneuve d'Ascq
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20180106/42041814/attachment-0001.html>


More information about the Vm-dev mailing list