Levente Uzonyi uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-ul.1412.mcz
==================== Summary ====================
Name: Kernel-ul.1412 Author: ul Time: 13 September 2021, 7:42:57.781301 pm UUID: 99321567-2351-48d2-9568-eb9d99079021 Ancestors: Kernel-eem.1410, Kernel-ul.1411
CompiledCode >> #hash : - remove #species from the hash calculation because #= doesn't compare that either - use #hashMultiply to mix in values with fewer collisions (increases the number of different hash values by about 1.5x in the image) - actualized comments - reset DebuggerMethodMap's MapCache, so that all collections relying on CompiledCode's #hash in a Trunk image are absent - finally, rehash all hashed collections just to be sure no collections are left in an invalid state
Also merge with Kernel-ul.1411.
=============== Diff against Kernel-eem.1410 ===============
Item was changed: ----- Method: CompiledCode>>hash (in category 'comparing') ----- hash + "CompiledCode>>#= compares code, i.e. same literals and same bytecode. + So we look at the size, the header and some bytes between initialPC and endPC, + but neither selector nor methodClass because the #= does not either.. + Note that we must override ByteArray>>#hash which looks at all bytes of the receiver. + Using bytes from the pointer part of a CompiledCode can lead to a variable 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 size hashMultiply + self header) hashMultiply + initialPC) hashMultiply + endPC) hashMultiply. - hash := self species hash + self header + initialPC + endPC bitAnd: 16rFFFFFFF. "sample approximately 20 bytes" initialPC to: endPC by: (endPC - initialPC // 20 max: 1) do: + [:i| hash := (hash + (self at: i)) hashMultiply]. - [:i| hash := hash + (self at: i)]. ^hash
+ "(CompiledCode>>#hash) hash"! - "(CompiledMethod>>#hash) hash"!
Item was added: + ----- Method: Fraction>>isPowerOfTwo (in category 'testing') ----- + isPowerOfTwo + "Return true if the receiver is an integral power of two." + + ^numerator = 1 and: [ denominator isPowerOfTwo ]!
Item was removed: - ----- Method: Integer>>isPowerOfTwo (in category 'testing') ----- - isPowerOfTwo - "Return true if the receiver is an integral power of two." - - ^self strictlyPositive and: [ (self bitAnd: self - 1) = 0 ]!
Item was added: + ----- Method: Number>>isPowerOfTwo (in category 'testing') ----- + isPowerOfTwo + "Return true if the receiver is an integral power of two." + + self subclassResponsibility!
Item was added: + ----- Method: ScaledDecimal>>isPowerOfTwo (in category 'testing') ----- + isPowerOfTwo + "Return true if the receiver is an integral power of two." + + ^fraction isPowerOfTwo!
Item was added: + ----- Method: SmallInteger>>isPowerOfTwo2 (in category 'testing') ----- + isPowerOfTwo2 + "Return true if the receiver is an integral power of two. Optimized version." + + ^self strictlyPositive and: [ (self bitAnd: self - 1) = 0 ]!
Item was added: + ----- Method: SmallInteger>>isPowerOfTwo3 (in category 'testing') ----- + isPowerOfTwo3 + "Return true if the receiver is an integral power of two. Optimized version." + + self > 0 ifFalse: [ ^false ]. + (self bitAnd: self - 1) = 0 ifFalse: [ ^false ]. + ^true!
Item was changed: + (PackageInfo named: 'Kernel') postscript: 'DebuggerMethodMap voidMapCache. + Smalltalk garbageCollect. + HashedCollection rehashAll'! - (PackageInfo named: 'Kernel') postscript: 'EventSensor initialize.. - EventSensor startUp..'!