WeakIdentitySet.st
changeset 20238 09af15b9e6b6
parent 18620 b4e9f25d6ce6
child 20244 20922299fd44
child 23723 77d7300d0e91
--- a/WeakIdentitySet.st	Thu Aug 11 15:27:01 2016 +0200
+++ b/WeakIdentitySet.st	Thu Aug 11 15:27:44 2016 +0200
@@ -11,6 +11,8 @@
 "
 "{ Package: 'stx:libbasic' }"
 
+"{ NameSpace: Smalltalk }"
+
 IdentitySet subclass:#WeakIdentitySet
 	instanceVariableNames:''
 	classVariableNames:''
@@ -225,7 +227,7 @@
      Grow the receiver, if key was not found, and no unused slots were present.
 
      Warning: an empty slot MUST be filled by the sender - it is only to be sent
-	      by at:put: / add: - like methods."
+              by at:put: / add: - like methods."
 
     |index  "{ Class:SmallInteger }"
      length "{ Class:SmallInteger }"
@@ -233,11 +235,11 @@
      delIndex "{ Class:SmallInteger }"|
 
     (OperatingSystem blockInterrupts) ifFalse:[
-	"/
-	"/ may never be entered with interrupts enabled
-	"/
-	OperatingSystem unblockInterrupts.
-	self error:'unblocked call of findKeyOrNil'.
+        "/
+        "/ may never be entered with interrupts enabled
+        "/
+        OperatingSystem unblockInterrupts.
+        self error:'unblocked call of findKeyOrNil'.
     ].
 
     delIndex := 0.
@@ -246,37 +248,100 @@
     startIndex := index := self initialIndexForKey:key.
 
     [
-	probe := keyArray basicAt:index.
-	key == probe ifTrue:[^ index].
-	probe isNil ifTrue:[
-	    delIndex == 0 ifTrue:[^ index].
-	    keyArray basicAt:delIndex put:nil.
-	    ^ delIndex
-	].
+        probe := keyArray basicAt:index.
+        key == probe ifTrue:[^ index].
+        probe isNil ifTrue:[
+            delIndex == 0 ifTrue:[^ index].
+            keyArray basicAt:delIndex put:nil.
+            ^ delIndex
+        ].
+
+        probe class == SmallInteger ifTrue:[
+            probe := DeletedEntry.
+            keyArray basicAt:index put:probe.
+            tally := tally - 1.
+        ].
+        delIndex == 0 ifTrue:[
+            probe == DeletedEntry ifTrue:[
+                delIndex := index
+            ]
+        ].
+
+        index == length ifTrue:[
+            index := 1
+        ] ifFalse:[
+            index := index + 1
+        ].
+        index == startIndex ifTrue:[
+            delIndex ~~ 0 ifTrue:[
+                keyArray basicAt:delIndex put:nil.
+                ^ delIndex
+            ].
+            self grow.
+            length := keyArray basicSize.
+            startIndex := index := self initialIndexForKey:key.
+        ].
+    ] loop.
+
+    "Modified: 30.1.1997 / 15:04:38 / cg"
+!
+
+findKeyOrNilOrDeletedEntry:key
+    "Look for the key in the receiver.
+     If it is found, return return the index, otherwise
+     the index of the first unused slot.
+     Grow the receiver, if key was not found, and no unused slots were present"
 
-	probe class == SmallInteger ifTrue:[
-	    probe := DeletedEntry.
-	    keyArray basicAt:index put:probe.
-	    tally := tally - 1.
-	].
-	delIndex == 0 ifTrue:[
-	    probe == DeletedEntry ifTrue:[
-		delIndex := index
-	    ]
-	].
+    |index  "{ Class:SmallInteger }"
+     length "{ Class:SmallInteger }"
+     startIndex probe
+     delIndex "{ Class:SmallInteger }"|
+
+    (OperatingSystem blockInterrupts) ifFalse:[
+        "/
+        "/ may never be entered with interrupts enabled
+        "/
+        OperatingSystem unblockInterrupts.
+        self error:'unblocked call of findKeyOrNil'.
+    ].
+
+    delIndex := 0.
+
+    length := keyArray basicSize.
+    startIndex := index := self initialIndexForKey:key.
 
-	index == length ifTrue:[
-	    index := 1
-	] ifFalse:[
-	    index := index + 1
-	].
-	index == startIndex ifTrue:[
-	    delIndex ~~ 0 ifTrue:[
-		keyArray basicAt:delIndex put:nil.
-		^ delIndex
-	    ].
-	    ^ self grow findKeyOrNil:key
-	].
+    [
+        probe := keyArray basicAt:index.
+        key == probe ifTrue:[^ index].
+        probe isNil ifTrue:[
+            delIndex == 0 ifTrue:[^ index].
+            ^ delIndex
+        ].
+
+        probe class == SmallInteger ifTrue:[
+            probe := DeletedEntry.
+            keyArray basicAt:index put:probe.
+            tally := tally - 1.
+        ].
+        delIndex == 0 ifTrue:[
+            probe == DeletedEntry ifTrue:[
+                delIndex := index
+            ]
+        ].
+
+        index == length ifTrue:[
+            index := 1
+        ] ifFalse:[
+            index := index + 1
+        ].
+        index == startIndex ifTrue:[
+            delIndex ~~ 0 ifTrue:[
+                ^ delIndex
+            ].
+            self grow.
+            length := keyArray basicSize.
+            startIndex := index := self initialIndexForKey:key.
+        ].
     ] loop.
 
     "Modified: 30.1.1997 / 15:04:38 / cg"