The Trunk: Kernel-eem.1198.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Kernel-eem.1198.mcz

commits-2
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1198.mcz

==================== Summary ====================

Name: Kernel-eem.1198
Author: eem
Time: 24 November 2018, 1:44:47.526422 pm
UUID: 100137c4-2514-4b7f-9064-3dcdfe7d8cc9
Ancestors: Kernel-eem.1197

Redefine LargePositiveInteger hash for compatibility between 32-bit and 64-bit systems.

=============== Diff against Kernel-eem.1197 ===============

Item was changed:
  ----- Method: LargePositiveInteger>>hash (in category 'comparing') -----
  hash
+ "Answer an integer value that is related to the value of the receiver.
+ Take care that the hash value is the same in both 32-bit and 64-bit versions.
+ Since the integers are by definition perfectly distributed a SmallInteger's hash is itself
+ (it is impossible to derive a hash function that is better distributed than the SmallIntegers
+ themselves).  Therefore, for integers that could possibly fit in the SmallInteger range, answer
+ self.  For values well outside of the SmallInteger range on 64-bits answer a hash that avoids
+ large integer arithmetic."
+ ^self digitLength <= 8
+ ifTrue: [self]
+ ifFalse:
+ [ByteArray
+ hashBytes: self
+ startingWith: self species hash]!
-
- ^ByteArray
- hashBytes: self
- startingWith: self species hash!

Item was changed:
  ----- Method: SmallInteger>>hash (in category 'comparing') -----
  hash
+ "Answer an integer value that is related to the value of the receiver.
+ Since the integers are by definition perfectly distributed answer self
+ (it is impossible to derive a hash function that is better distributed
+ than the SmallIntegers themselves). c.f. LargePositiveInteger hash."
 
  ^self!

Item was changed:
  (PackageInfo named: 'Kernel') postscript: '"below, add code to be run after the loading of this package"
+ "Since Kernel-eem.1198 redefines LargePositiveInteger hash,
+  rehash all hashed collections that contain hashed large integers."
+ HashedCollection allSubclassesDo:
+ [:c| | f |
+ f := (c includesBehavior: Set)
+ ifTrue: [[:i| i]]
+ ifFalse: [[:i| i keys]].
+ c allInstancesDo:
+ [:h|
+ ((f value: h) detect: [:e| e isInteger and: [e class ~~ SmallInteger]] ifNone: nil) ifNotNil:
+ [h halt rehash]]]'!
- ((ByteArray subclasses includes: CompiledMethod)
-  and: [CompiledMethod superclass ~= ByteArray]) ifTrue:
- [ByteArray removeSubclass: CompiledMethod].
- (Smalltalk classNamed: #FullBlockClosure) ifNotNil:
- [:fbc|
- (fbc identityHash ~= 38) ifTrue:
- [fbc tryPrimitive: 161 withArgs: #(38 true)]]'!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-eem.1198.mcz

Levente Uzonyi
On Sat, 24 Nov 2018, [hidden email] wrote:

> Eliot Miranda uploaded a new version of Kernel to project The Trunk:
> http://source.squeak.org/trunk/Kernel-eem.1198.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-eem.1198
> Author: eem
> Time: 24 November 2018, 1:44:47.526422 pm
> UUID: 100137c4-2514-4b7f-9064-3dcdfe7d8cc9
> Ancestors: Kernel-eem.1197
>
> Redefine LargePositiveInteger hash for compatibility between 32-bit and 64-bit systems.
>
> =============== Diff against Kernel-eem.1197 ===============
>
> Item was changed:
>  ----- Method: LargePositiveInteger>>hash (in category 'comparing') -----
>  hash
> + "Answer an integer value that is related to the value of the receiver.
> + Take care that the hash value is the same in both 32-bit and 64-bit versions.
> + Since the integers are by definition perfectly distributed a SmallInteger's hash is itself
> + (it is impossible to derive a hash function that is better distributed than the SmallIntegers
> + themselves).  Therefore, for integers that could possibly fit in the SmallInteger range, answer
> + self.  For values well outside of the SmallInteger range on 64-bits answer a hash that avoids
> + large integer arithmetic."
> + ^self digitLength <= 8
> + ifTrue: [self]
> + ifFalse:
> + [ByteArray
> + hashBytes: self
> + startingWith: self species hash]!
> -
> - ^ByteArray
> - hashBytes: self
> - startingWith: self species hash!
>
> Item was changed:
>  ----- Method: SmallInteger>>hash (in category 'comparing') -----
>  hash
> + "Answer an integer value that is related to the value of the receiver.
> + Since the integers are by definition perfectly distributed answer self
> + (it is impossible to derive a hash function that is better distributed
> + than the SmallIntegers themselves). c.f. LargePositiveInteger hash."
>
>   ^self!
>
> Item was changed:
>  (PackageInfo named: 'Kernel') postscript: '"below, add code to be run after the loading of this package"
> + "Since Kernel-eem.1198 redefines LargePositiveInteger hash,
> +  rehash all hashed collections that contain hashed large integers."
> + HashedCollection allSubclassesDo:
> + [:c| | f |
> + f := (c includesBehavior: Set)
> + ifTrue: [[:i| i]]
> + ifFalse: [[:i| i keys]].
> + c allInstancesDo:
> + [:h|
> + ((f value: h) detect: [:e| e isInteger and: [e class ~~ SmallInteger]] ifNone: nil) ifNotNil:
> + [h halt rehash]]]'!

Is there a reason for that #halt to be there?

Levente

> - ((ByteArray subclasses includes: CompiledMethod)
> -  and: [CompiledMethod superclass ~= ByteArray]) ifTrue:
> - [ByteArray removeSubclass: CompiledMethod].
> - (Smalltalk classNamed: #FullBlockClosure) ifNotNil:
> - [:fbc|
> - (fbc identityHash ~= 38) ifTrue:
> - [fbc tryPrimitive: 161 withArgs: #(38 true)]]'!

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-eem.1198.mcz

Bob Arning-2
In reply to this post by commits-2
just curious, but what is the halt for?

On 11/24/18 9:45 PM, [hidden email] wrote:
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1198.mcz

==================== Summary ====================

Name: Kernel-eem.1198
Author: eem
Time: 24 November 2018, 1:44:47.526422 pm
UUID: 100137c4-2514-4b7f-9064-3dcdfe7d8cc9
Ancestors: Kernel-eem.1197

Redefine LargePositiveInteger hash for compatibility between 32-bit and 64-bit systems.

=============== Diff against Kernel-eem.1197 ===============

Item was changed:
  ----- Method: LargePositiveInteger>>hash (in category 'comparing') -----
  hash
+ 	"Answer an integer value that is related to the value of the receiver.
+ 	 Take care that the hash value is the same in both 32-bit and 64-bit versions.
+ 	 Since the integers are by definition perfectly distributed a SmallInteger's hash is itself
+ 	 (it is impossible to derive a hash function that is better distributed than the SmallIntegers
+ 	 themselves).  Therefore, for integers that could possibly fit in the SmallInteger range, answer
+ 	 self.  For values well outside of the SmallInteger range on 64-bits answer a hash that avoids
+ 	 large integer arithmetic."
+ 	^self digitLength <= 8
+ 		ifTrue: [self]
+ 		ifFalse:
+ 			[ByteArray
+ 				hashBytes: self
+ 				startingWith: self species hash]!
- 
- 	^ByteArray
- 		hashBytes: self
- 		startingWith: self species hash!

Item was changed:
  ----- Method: SmallInteger>>hash (in category 'comparing') -----
  hash
+ 	"Answer an integer value that is related to the value of the receiver.
+ 	 Since the integers are by definition perfectly distributed answer self
+ 	 (it is impossible to derive a hash function that is better distributed
+ 	 than the SmallIntegers themselves). c.f. LargePositiveInteger hash."
  
  	^self!

Item was changed:
  (PackageInfo named: 'Kernel') postscript: '"below, add code to be run after the loading of this package"
+ "Since Kernel-eem.1198 redefines LargePositiveInteger hash,
+  rehash all hashed collections that contain hashed large integers."
+ HashedCollection allSubclassesDo:
+ 	[:c| | f |
+ 	f := (c includesBehavior: Set)
+ 			ifTrue: [[:i| i]]
+ 			ifFalse: [[:i| i keys]].
+ 	c allInstancesDo:
+ 		[:h|
+ 		 ((f value: h) detect: [:e| e isInteger and: [e class ~~ SmallInteger]] ifNone: nil) ifNotNil:
+ 			[h halt rehash]]]'!
- ((ByteArray subclasses includes: CompiledMethod)
-  and: [CompiledMethod superclass ~= ByteArray]) ifTrue:
- 	[ByteArray removeSubclass: CompiledMethod].
- (Smalltalk classNamed: #FullBlockClosure) ifNotNil:
- 	[:fbc|
- 	(fbc identityHash ~= 38) ifTrue:
- 		[fbc tryPrimitive: 161 withArgs: #(38 true)]]'!





Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Kernel-eem.1198.mcz

Eliot Miranda-2
In reply to this post by Levente Uzonyi


On Sat, Nov 24, 2018 at 3:14 PM Levente Uzonyi <[hidden email]> wrote:
On Sat, 24 Nov 2018, [hidden email] wrote:

> Eliot Miranda uploaded a new version of Kernel to project The Trunk:
> http://source.squeak.org/trunk/Kernel-eem.1198.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-eem.1198
> Author: eem
> Time: 24 November 2018, 1:44:47.526422 pm
> UUID: 100137c4-2514-4b7f-9064-3dcdfe7d8cc9
> Ancestors: Kernel-eem.1197
>
> Redefine LargePositiveInteger hash for compatibility between 32-bit and 64-bit systems.
>
> =============== Diff against Kernel-eem.1197 ===============
>
> Item was changed:
>  ----- Method: LargePositiveInteger>>hash (in category 'comparing') -----
>  hash
> +     "Answer an integer value that is related to the value of the receiver.
> +      Take care that the hash value is the same in both 32-bit and 64-bit versions.
> +      Since the integers are by definition perfectly distributed a SmallInteger's hash is itself
> +      (it is impossible to derive a hash function that is better distributed than the SmallIntegers
> +      themselves).  Therefore, for integers that could possibly fit in the SmallInteger range, answer
> +      self.  For values well outside of the SmallInteger range on 64-bits answer a hash that avoids
> +      large integer arithmetic."
> +     ^self digitLength <= 8
> +             ifTrue: [self]
> +             ifFalse:
> +                     [ByteArray
> +                             hashBytes: self
> +                             startingWith: self species hash]!
> -
> -     ^ByteArray
> -             hashBytes: self
> -             startingWith: self species hash!
>
> Item was changed:
>  ----- Method: SmallInteger>>hash (in category 'comparing') -----
>  hash
> +     "Answer an integer value that is related to the value of the receiver.
> +      Since the integers are by definition perfectly distributed answer self
> +      (it is impossible to derive a hash function that is better distributed
> +      than the SmallIntegers themselves). c.f. LargePositiveInteger hash."
>
>       ^self!
>
> Item was changed:
>  (PackageInfo named: 'Kernel') postscript: '"below, add code to be run after the loading of this package"
> + "Since Kernel-eem.1198 redefines LargePositiveInteger hash,
> +  rehash all hashed collections that contain hashed large integers."
> + HashedCollection allSubclassesDo:
> +     [:c| | f |
> +     f := (c includesBehavior: Set)
> +                     ifTrue: [[:i| i]]
> +                     ifFalse: [[:i| i keys]].
> +     c allInstancesDo:
> +             [:h|
> +              ((f value: h) detect: [:e| e isInteger and: [e class ~~ SmallInteger]] ifNone: nil) ifNotNil:
> +                     [h halt rehash]]]'!

Is there a reason for that #halt to be there?

Damn. I was debugging the script to make sure it would work (there are no such dictionaries or sets in a normal image), and I forgot to remove the halt.  I shall submit a new version...
 

Levente

> - ((ByteArray subclasses includes: CompiledMethod)
> -  and: [CompiledMethod superclass ~= ByteArray]) ifTrue:
> -     [ByteArray removeSubclass: CompiledMethod].
> - (Smalltalk classNamed: #FullBlockClosure) ifNotNil:
> -     [:fbc|
> -     (fbc identityHash ~= 38) ifTrue:
> -             [fbc tryPrimitive: 161 withArgs: #(38 true)]]'!



--
_,,,^..^,,,_
best, Eliot