On Sun, May 27, 2012 at 8:37 PM, Levente Uzonyi leves@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@source.squeak.org wrote:
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/**trunk/Kernel-eem.692.mczhttp://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"!