The Trunk: Collections-ul.217.mcz

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

The Trunk: Collections-ul.217.mcz

commits-2
Andreas Raab uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-ul.217.mcz

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

Name: Collections-ul.217
Author: ul
Time: 30 November 2009, 4:47:54 am
UUID: a67f6177-4f3f-bd41-af32-c1881c7f0e20
Ancestors: Collections-ul.216

Replace sends of #scanForEmptySlotFor: with #scanFor:. This enables atomic changes of the hash implementation.

=============== Diff against Collections-dtl.214 ===============

Item was added:
+ ----- Method: CollectionRehashingUtility>>rehashAllSets (in category 'private - rehashing') -----
+ rehashAllSets
+
+ HashedCollection rehashAll!

Item was added:
+ ----- Method: CollectionRehashingUtility class>>rehashBecause: (in category 'rehashing') -----
+ rehashBecause: aSymbol
+
+ self new rehashBecause: aSymbol!

Item was changed:
  ----- Method: KeyedSet>>noCheckNoGrowFillFrom: (in category 'private') -----
  noCheckNoGrowFillFrom: anArray
  "Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require."
 
  1 to: anArray size do: [ :index |
  | object |
  (object := anArray at: index) ifNotNil: [
  array
+ at: (self scanFor: (keyBlock value: object))
- at: (self scanForEmptySlotFor: (keyBlock value: object))
  put: object ] ]!

Item was added:
+ ----- Method: CollectionRehashingUtility>>changes (in category 'private - accessing') -----
+ changes
+
+ ^changes!

Item was added:
+ ----- Method: CollectionRehashingUtility>>quickRehashAllSets (in category 'private - rehashing') -----
+ quickRehashAllSets
+
+ HashedCollection withAllSubclassesDo:
+ [:class |
+ class = MethodDictionary ifFalse:
+ [class allInstances do: [:each | each rehash]]
+ ]!

Item was added:
+ ----- Method: CollectionRehashingUtility class>>new (in category 'instance creation') -----
+ new
+
+ self current notNil ifTrue: [^self current].
+ self current: super new initialize.
+ ^self current!

Item was changed:
  ----- Method: WeakSet>>noCheckNoGrowFillFrom: (in category 'private') -----
  noCheckNoGrowFillFrom: anArray
  "Add the elements of anArray except nils and flag to me assuming that I don't contain any of them, they are unique and I have more free space than they require."
 
  tally := 0.
  1 to: anArray size do: [ :index |
  | object |
  ((object := anArray at: index) == flag or: [
  object == nil ]) ifFalse: [
  array
+ at: (self scanFor: object)
- at: (self scanForEmptySlotFor: object)
  put: object.
  tally := tally + 1 ] ]!

Item was changed:
  ----- Method: Set>>noCheckNoGrowFillFrom: (in category 'private') -----
  noCheckNoGrowFillFrom: anArray
  "Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require."
 
  1 to: anArray size do: [ :index |
  | object |
  (object := anArray at: index) ifNotNil: [
  array
+ at: (self scanFor: object)
- at: (self scanForEmptySlotFor: object)
  put: object ] ]!

Item was changed:
  ----- Method: Dictionary>>noCheckNoGrowFillFrom: (in category 'private') -----
  noCheckNoGrowFillFrom: anArray
  "Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require."
 
  1 to: anArray size do: [ :index |
  | object |
  (object := anArray at: index) ifNotNil: [
  array
+ at: (self scanFor: object key)
- at: (self scanForEmptySlotFor: object key)
  put: object ] ]!

Item was changed:
  ----- Method: WeakKeyDictionary>>noCheckNoGrowFillFrom: (in category 'private') -----
  noCheckNoGrowFillFrom: anArray
  "Add the elements of anArray except nils and flag to me assuming that I don't contain any of them, they are unique and I have more free space than they require."
 
  tally := 0.
  1 to: anArray size do:[ :i |
  | association |
  (association := anArray at: i) ifNotNil: [
  array
+ at: (self scanFor: association key)
- at: (self scanForEmptySlotFor: association key)
  put: association.
  tally := tally + 1 ] ]!

Item was added:
+ ----- Method: CollectionRehashingUtility>>quickRehashBecause: (in category 'rehashing') -----
+ quickRehashBecause: aSymbol
+
+ (self changes includes: aSymbol) ifTrue: [^self].
+ self changes add: aSymbol.
+ self quickRehashAllSets!

Item was added:
+ ----- Method: CollectionRehashingUtility class>>current: (in category 'private - accessing') -----
+ current: anInstance
+
+ current := anInstance!

Item was changed:
  ----- Method: WeakSet>>do: (in category 'public') -----
  do: aBlock
- | each |
 
  tally = 0 ifTrue: [^self].
+ array do: [ :each |
+ (each == nil or: [each == flag])
+ ifFalse: [ aBlock value: each ] ]!
- 1 to: array size do:
- [:index |
- ((each := array at: index) == nil or: [each == flag])
- ifFalse: [aBlock value: each]
- ]!

Item was changed:
  ----- Method: WeakKeyDictionary>>finalizeValues: (in category 'finalization') -----
  finalizeValues: finiObjects
  "Remove all associations with key == nil and value is in finiObjects.
  This method is folded with #rehash for efficiency."
 
  | oldArray |
  oldArray := array.
  array := Array new: oldArray size.
  tally := 0.
  1 to: array size do:[ :i |
  | association |
  (association := oldArray at: i) ifNotNil: [
  | key |
  ((key := association key) == nil and: [ "Don't let the key go away"
  finiObjects includes: association value ])
  ifFalse: [
  array
+ at: (self scanFor: key)
- at: (self scanForEmptySlotFor: key)
  put: association.
  tally := tally + 1 ] ] ]!

Item was changed:

Item was added:
+ ----- Method: CollectionRehashingUtility>>rehashBecause: (in category 'rehashing') -----
+ rehashBecause: aSymbol
+
+ (self changes includes: aSymbol) ifTrue: [^self].
+ self changes add: aSymbol.
+ self rehashAllSets.
+ self rehashSymbolTable!

Item was changed:
  ----- Method: WeakKeyToCollectionDictionary>>noCheckNoGrowFillFrom: (in category 'as yet unclassified') -----
  noCheckNoGrowFillFrom: anArray
  "Add the elements of anArray except nils and associations with empty collections (or with only nils) to me assuming that I don't contain any of them, they are unique and I have more free space than they require."
 
  tally := 0.
  1 to: anArray size do:[ :i |
  | association cleanedValue |
  ((association := anArray at: i) == nil or: [
  (cleanedValue := association value copyWithout: nil) isEmpty ])
  ifFalse: [
  association value: cleanedValue.
  array
+ at: (self scanFor: association key)
- at: (self scanForEmptySlotFor: association key)
  put: association.
  tally := tally + 1 ] ]!

Item was changed:
  ----- Method: Dictionary>>associationsDo: (in category 'enumerating') -----
  associationsDo: aBlock
  "Evaluate aBlock for each of the receiver's elements (key/value
  associations)."
 
  tally = 0 ifTrue: [ ^self].
+ array do: [ :each | each ifNotNil: [ aBlock value: each ] ]!
- 1 to: array size do: [ :index |
- | each |
- (each := array at: index)
- ifNotNil: [ aBlock value: each ] ]!

Item was added:
+ ----- Method: CollectionRehashingUtility class>>current (in category 'private - accessing') -----
+ current
+
+ ^current!

Item was added:
+ ----- Method: CollectionRehashingUtility>>initialize (in category 'private') -----
+ initialize
+
+ self changes: OrderedCollection new!

Item was added:
+ ----- Method: CollectionRehashingUtility>>rehashSymbolTable (in category 'private - rehashing') -----
+ rehashSymbolTable
+
+ Symbol rehash!

Item was changed:
  ----- Method: Set>>do: (in category 'enumerating') -----
  do: aBlock
 
  tally = 0 ifTrue: [ ^self ].
+ array do: [ :each | each ifNotNil: [ aBlock value: each ] ]!
- 1 to: array size do: [ :index |
- | each |
- (each := array at: index)
- ifNotNil: [ aBlock value: each ] ]!

Item was added:
+ Object subclass: #CollectionRehashingUtility
+ instanceVariableNames: 'changes'
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'Collections-Unordered'!
+ CollectionRehashingUtility class
+ instanceVariableNames: 'current'!

Item was added:
+ ----- Method: CollectionRehashingUtility class>>quickRehashBecause: (in category 'rehashing') -----
+ quickRehashBecause: aSymbol
+
+ self new quickRehashBecause: aSymbol!

Item was added:
+ ----- Method: CollectionRehashingUtility>>changes: (in category 'private - accessing') -----
+ changes: aCollection
+ "aCollection must not be a hashed collection"
+
+ changes := aCollection!