diff -r b5cdb27022c8 -r 20922299fd44 WeakIdentitySet.st --- a/WeakIdentitySet.st Thu Aug 11 06:44:08 2016 +0200 +++ b/WeakIdentitySet.st Fri Aug 12 06:44:59 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"