Use inlined FNV1a hash for String
...and do not use __symbolHash(). Although currently the VM also
uses FNV1a hash for Symbols, the __symbolHash() does not handle
properly character with codepoint 0 (because '\0' is used as a
string terminator). This causes problems with Unicode16/32Strigs whose
version of FNV1a hash is using object size from header to determine
string's end.
Added Symbol>>hash that actually *uses* the __symbolHash() to make
sure it's hash is the the same as used bu the VM. Symbols with zeroes
are rare and there's no Unicode16/32Symbol.
This commit fixes issue #65.
"
COPYRIGHT (c) 1999 by eXept Software AG
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
"{ Package: 'stx:libbasic' }"
"{ Package: 'stx:libbasic' }"
Registry subclass:#CachingRegistry
instanceVariableNames:'keptReferences cacheSize'
classVariableNames:''
poolDictionaries:''
category:'System-Support'
!
!CachingRegistry class methodsFor:'documentation'!
copyright
"
COPYRIGHT (c) 1999 by eXept Software AG
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
!
documentation
"
A CachingRegistry behaves generally like a registry;
However, it keeps hard references to the last n registered objects,
preventing them from being garbage collected (and finalized).
This is useful for resources, which do not cost too much memory,
but are expensive to allocate - a special canditate of this kind are
XFonts. With a CachingRegistry, fonts are kept a bit longer alive
and can therefore often be reused - even if temporarily unreferenced.
This is kind of experimental.
[author:]
Claus Gittinger (cg@exept)
[see also:]
[instance variables:]
keptObjects Collection hard referenced objects
cacheSize Integer number of hard references
[class variables:]
"
! !
!CachingRegistry methodsFor:'private'!
cacheSize:aNumber
keptReferences := OrderedCollection new:aNumber.
cacheSize := aNumber.
! !
!CachingRegistry methodsFor:'registering objects'!
register:anObject as:aHandle
keptReferences removeIdentical:anObject ifAbsent:nil.
keptReferences addLast:anObject.
keptReferences size > cacheSize ifTrue:[
keptReferences removeFirst.
].
super register:anObject as:aHandle.
!
repairTally
keptReferences := OrderedCollection new:cacheSize.
super repairTally.
!
unregister:anObject atIndex:index
keptReferences removeIdentical:anObject ifAbsent:nil.
super unregister:anObject atIndex:index.
! !
!CachingRegistry class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libbasic/CachingRegistry.st,v 1.2 2015-04-21 16:01:16 cg Exp $'
!
version_SVN
^ '$Id: CachingRegistry.st 10761 2012-01-19 11:46:00Z vranyj1 $'
! !