[squeak-dev] The Trunk: Kernel-eem.692.mcz

Eliot Miranda eliot.miranda at gmail.com
Tue May 29 22:50:08 UTC 2012


On Sun, May 27, 2012 at 8:37 PM, Levente Uzonyi <leves at elte.hu> wrote:

> It's a bit dangerous to change the hash without rehashing the collections
> which contain CompiledMethods as keys. For example DebuggerMethodMap's
> MapCache uses CompiledMethods as keys.



Good point.  I'll fix this when I fix the methods comment ( COmpiledmethod
=> CompiledMethod)


>
>
>
> Levente
>
>
> On Sun, 27 May 2012, commits at source.squeak.org wrote:
>
>  Eliot Miranda uploaded a new version of Kernel to project The Trunk:
>> http://source.squeak.org/**trunk/Kernel-eem.692.mcz<http://source.squeak.org/trunk/Kernel-eem.692.mcz>
>>
>> ==================== Summary ====================
>>
>> Name: Kernel-eem.692
>> Author: eem
>> Time: 27 May 2012, 3:08:41.389 pm
>> UUID: 72f75218-3cfc-4575-b159-**8de0e44aa479
>> Ancestors: Kernel-nice.691
>>
>> Implement CompiledMethod>>#hash, both to accord with
>> CompiledMethod>>#= and to override ByteArray>>#hash
>> which looks at all bytes of the receiver and hence may
>> produce a variable hash if the GC moves literals in a method.
>>
>> =============== Diff against Kernel-nice.691 ===============
>>
>> Item was added:
>> + ----- Method: CompiledMethod>>hash (in category 'comparing') -----
>> + hash
>> +       "CompiledMethod>>#= compares code, i.e. same literals and same
>> bytecode.
>> +        So we look at the header, methodClass and some bytes between
>> initialPC and endPC,
>> +        but /not/ the selector because the equal method does not compare
>> selectors.
>> +        Note that we must override ByteArray>hash which looks at all
>> bytes of the receiver.
>> +        Using bytes from the pointer part of a COmpiledmethod can lead
>> to a variable hash
>> +        if and when when the GC moves literals in the receiver."
>> +       | initialPC endPC hash |
>> +       initialPC := self initialPC.
>> +       endPC := self endPC.
>> +       hash := self species hash + self header + initialPC + endPC +
>> self methodClass hash bitAnd: 16rFFFFFFF.
>> +       "sample approximately 20 bytes"
>> +       initialPC to: endPC by: (endPC - initialPC // 20 max: 1) do:
>> +               [:i| hash := hash + (self at: i)].
>> +       ^hash
>> +
>> +       "(CompiledMethod>>#hash) hash"!
>>
>>
>>
>>
>


-- 
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20120529/d6a91299/attachment.htm


More information about the Squeak-dev mailing list