More than that, since CompiledMethod redefines #=, it is strange that
it's not redefines #hash as well,
because it is one of requirements to make sure they are always in sync.
indeed!
�
> Two conclusions:
>
> The solution is to define CompiledMethod>hash such that it does not access bytes < initialPC. �The hash it is inheriting from ByteArray is fine for ByteArray but not at all OK for CompiledMethod.
>
Yes, i would just do
self methodClass hash bitXor: self selector hash
that's one possibility. If we want to continue with the previous kind of hash we also could do something like:
CompiledMethod >> hash
��� "#hash is implemented, because #= is implemented"
��� ^self class
��� ��� hashBytes: self bytecodes
��� ��� startingWith: self species hash
��� ���
CompiledMethod >> bytecodes
��� | initialPC endPC bytecodes |
��� initialPC := self initialPC.
��� endPC := self endPC.
��� bytecodes := ByteArray new: (endPC - initialPC + 1).
��� initialPC to: endPC do: [:index |
��� ��� bytecodes at: (index - initialPC + 1) put: (self at: index)
��� ��� ].
��� ^ bytecodes
I am not a hashing expert. What do you think? which impl should we do?
�