On 2 August 2011 14:18, Henrik Johansen <[email protected]> wrote:
>
> On Aug 1, 2011, at 8:43 53AM, Igor Stasenko wrote:
>
>> I found that #testBecomeIdentityHash sometimes failing, sometimes not.
>>
>> It seems like VM 'forgets' to produce different identityHash bits for
>> two consequently allocated objects,
>> while test assumes that they are always different.
>>
>> If i insert a statement (see the code), test no longer fails.
>>
>> testBecomeIdentityHash
>>       "Note. The identity hash of both objects seems to change after the 
>> become:"
>>
>>       | a b c d |
>>
>>       a := 'ab' copy.
>>       b := 'cd' copy.
>>
>>>>>    [ b identityHash = a identityHash ] whileTrue: [ b := b copy ].
>>
>>       c := a.
>>       d := b.
>>
>>       a become: b.
>>
>>       self
>>               assert: a identityHash = c identityHash;
>>               assert: b identityHash = d identityHash;
>>               deny: a identityHash = b identityHash.
>>
>> A simple piece of code reveals the problem:
>>
>> (1 to: 20) collect: [:i |
>>       'ab' copy basicIdentityHash ] #(954 954 955 955 956 956 957 957 958
>> 958 959 959 960 960 961 961 962 962 963 963)
>>
>>
>> --
>> Best regards,
>> Igor Stasenko AKA sig.
>
> What is the point of this test in the first place?
> To me it seems to test whether a VM's implementation of become: adheres to 
> some properties.
> At least, VM bugs in traversal of references during become is the only way I 
> could see the two first asserts EVER being false.
>
> As for the last assert (well, deny actually), in the context of what it's 
> supposed to test as established above, it seems to me to say a VM should 
> never give the same identityHash to subsequently copied objects. Which means
> a) It has nothing to do with become and identityHash, thus is in the test.
> b) Is this a property any code actually rely on?
>
> If not, why would we assert such a restriction on the VM implementation, or 
> is it harmless?
>
> Either way, modifying the test to iterate till they ARE different, would make 
> it meaningless in either case (and possible infinite loop in case of a really 
> bad VM).
>

There is strong reason to test identityHashes, because VM should
preserve an identity hash for oops.

But of course test is wrong , because to test that , it should be like
following:

     | a b hash1 hash2 |

       a := 'ab' copy.
       b := 'cd' copy.
   hash1 := a identityHash.
   hash2 := b identityHash.

   a become: b.

       self
        assert: a identityHash = hash1;
        assert: b identityHash = hash2.


-- 
Best regards,
Igor Stasenko AKA sig.

Reply via email to