hashtable bugfix

GSI code version optional.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@12358 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2002-02-01 10:19:56 +00:00
parent f6901afbe4
commit 59e387cc17
14 changed files with 150 additions and 17 deletions

View file

@ -1,3 +1,23 @@
2002-02-01 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSHashTable.m: Fixed bug intorduced by last change to add
error checking!!
* Source/GSAttributedString.m: Make new or old GSI stuff optional.
* Source/GSCountedSet.m: ditto
* Source/GSDictionary.m: ditto
* Source/GSFFCallInvocation.m: ditto
* Source/NSArchiver.m: ditto
* Source/NSConnection.m: ditto
* Source/NSFileManager.m: ditto
* Source/NSNotificationCenter.m: ditto
* Source/NSObject.m: ditto
* Source/NSPortCoder.m: ditto
* Source/NSRunLoop.m: ditto
* Source/NSSerializer.m: ditto
* Source/NSUnarchiver.m: ditto
Interim phase ... version of source which should build with new or
old GSIMap and GSIArray APIs at the defination of GSI_NEW
2002-01-31 Adam Fedor <fedor@gnu.org>
* Old/*: Removed (now at

View file

@ -91,12 +91,19 @@
#define GSI_NEW 1
#ifdef GSI_NEW 1
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RELEASE_KEY(M, X)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#define GSI_MAP_EQUAL(M, X,Y) [(X).obj isEqualToDictionary: (Y).obj]
#else
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RELEASE_KEY(X)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#define GSI_MAP_EQUAL(X,Y) [(X).obj isEqualToDictionary: (Y).obj]
#endif
#define GSI_MAP_KTYPES GSUNION_OBJ
#define GSI_MAP_VTYPES GSUNION_INT

View file

@ -32,9 +32,14 @@
#include <Foundation/NSDebug.h>
#define GSI_NEW 1
#ifdef GSI_NEW
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#else
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#endif
#define GSI_MAP_KTYPES GSUNION_OBJ
#define GSI_MAP_VTYPES GSUNION_INT
@ -293,7 +298,11 @@
{
GSIMapNode node;
#ifdef GSI_NEW
node = GSIMapNodeForKeyInBucket(&map, bucket, (GSIMapKey)anObject);
#else
node = GSIMapNodeForKeyInBucket(bucket, (GSIMapKey)anObject);
#endif
if (node != 0)
{
if (--node->value.uint == 0)

View file

@ -33,17 +33,23 @@
#include <base/behavior.h>
#define GSI_NEW 1
/*
* The 'Fastmap' stuff provides an inline implementation of a mapping
* table - for maximum performance.
*/
#define GSI_MAP_KTYPES GSUNION_OBJ
#define GSI_MAP_VTYPES GSUNION_OBJ
#ifdef GSI_NEW
#define GSI_MAP_HASH(M, X) [X.obj hash]
#define GSI_MAP_EQUAL(M, X,Y) [X.obj isEqual: Y.obj]
#define GSI_MAP_RETAIN_KEY(M, X) ((id)(X).obj) = \
[((id)(X).obj) copyWithZone: map->zone]
#else
#define GSI_MAP_HASH(X) [X.obj hash]
#define GSI_MAP_EQUAL(X,Y) [X.obj isEqual: Y.obj]
#define GSI_MAP_RETAIN_KEY(X) ((id)(X).obj) = \
[((id)(X).obj) copyWithZone: map->zone]
#endif
#include <base/GSIMap.h>

View file

@ -106,13 +106,21 @@ ReturnTypeEqualsReturnType (vacallReturnTypeInfo *a, vacallReturnTypeInfo *b)
&& (a->type == b->type);
}
#define GSI_NEW 1
#ifdef GSI_NEW
#define GSI_MAP_HASH(M, X) ReturnTypeHash (X.ptr)
#define GSI_MAP_EQUAL(M, X,Y) ReturnTypeEqualsReturnType (X.ptr, Y.ptr)
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_KEY(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#else
#define GSI_MAP_HASH(X) ReturnTypeHash (X.ptr)
#define GSI_MAP_EQUAL(X,Y) ReturnTypeEqualsReturnType (X.ptr, Y.ptr)
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_KEY(X)
#define GSI_MAP_RELEASE_VAL(X)
#endif
#include <base/GSIMap.h>

View file

@ -28,13 +28,21 @@
/*
* Setup for inline operation of pointer map tables.
*/
#define GSI_NEW 1
#ifdef GSI_NEW
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RELEASE_KEY(M, X)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#define GSI_MAP_HASH(M, X) ((X).uint)
#define GSI_MAP_EQUAL(M, X,Y) ((X).uint == (Y).uint)
#else
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RELEASE_KEY(X)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#define GSI_MAP_HASH(X) ((X).uint)
#define GSI_MAP_EQUAL(X ,Y) ((X).uint == (Y).uint)
#endif
#include <base/GSIMap.h>

View file

@ -37,13 +37,21 @@
/*
* Setup for inline operation of pointer map tables.
*/
#define GSI_NEW 1
#ifdef GSI_NEW
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RELEASE_KEY(M, X)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#define GSI_MAP_HASH(M, X) ((X).uint ^ ((X).uint >> 3))
#define GSI_MAP_EQUAL(M, X,Y) ((X).ptr == (Y).ptr)
#else
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RELEASE_KEY(X)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#define GSI_MAP_HASH(X) ((X).uint ^ ((X).uint >> 3))
#define GSI_MAP_EQUAL(X,Y) ((X).ptr == (Y).ptr)
#endif
#include <base/GSIMap.h>

View file

@ -1376,12 +1376,16 @@ inline void gsedRelease(GSEnumeratedDirectory X)
closedir(X.pointer);
}
#define GSI_NEW 1
#define GSI_ARRAY_TYPES 0
#ifdef GSI_NEW
#define GSI_ARRAY_TYPE GSEnumeratedDirectory
#define GSI_ARRAY_RELEASE(A, X) gsedRelease(X.ext)
#define GSI_ARRAY_RETAIN(A, X)
#else
#define GSI_ARRAY_EXTRA GSEnumeratedDirectory
#define GSI_ARRAY_RELEASE(X) gsedRelease(X.ext)
#define GSI_ARRAY_RETAIN(X)
#endif
#include <base/GSIArray.h>

View file

@ -110,16 +110,20 @@ static void obsRetain(Observation *o);
static void obsFree(Observation *o);
#define GSI_NEW 1
#define GSI_ARRAY_TYPES 0
#ifdef GSI_NEW
#define GSI_ARRAY_TYPE Observation*
#define GSI_ARRAY_RELEASE(A, X) obsFree(X.ext)
#define GSI_ARRAY_RETAIN(A, X) obsRetain(X.ext)
#else
#define GSI_ARRAY_EXTRA Observation*
#define GSI_ARRAY_RELEASE(X) obsFree(X.ext)
#define GSI_ARRAY_RETAIN(X) obsRetain(X.ext)
#endif
#include <base/GSIArray.h>
#ifdef GSI_NEW
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RELEASE_KEY(M, X) ({if ((((gsaddr)X.obj) & 1) == 0) \
RELEASE(X.obj);})
@ -127,6 +131,15 @@ static void obsFree(Observation *o);
#define GSI_MAP_EQUAL(M, X,Y) doEqual(X.obj, Y.obj)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#else
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RELEASE_KEY(X) ({if ((((gsaddr)X.obj) & 1) == 0) \
RELEASE(X.obj);})
#define GSI_MAP_HASH(X) doHash(X.obj)
#define GSI_MAP_EQUAL(X,Y) doEqual(X.obj, Y.obj)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#endif
#define GSI_MAP_KTYPES GSUNION_OBJ|GSUNION_INT
#define GSI_MAP_VTYPES GSUNION_PTR

View file

@ -225,13 +225,21 @@ NSDecrementExtraRefCountWasZero(id anObject)
#else
#define GSI_NEW 1
#ifdef GSI_NEW
#define GSI_MAP_EQUAL(M, X, Y) (X.obj == Y.obj)
#define GSI_MAP_HASH(M, X) (X.ptr >> 2)
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RELEASE_KEY(M, X)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#else
#define GSI_MAP_EQUAL(X, Y) (X.obj == Y.obj)
#define GSI_MAP_HASH(X) (X.ptr >> 2)
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RELEASE_KEY(X)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#endif
#define GSI_MAP_KTYPES GSUNION_OBJ
#define GSI_MAP_VTYPES GSUNION_INT

View file

@ -49,21 +49,34 @@
/*
* Setup for inline operation of pointer map tables.
*/
#define GSI_NEW 1
#ifdef GSI_NEW
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RELEASE_KEY(M, X)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#define GSI_MAP_HASH(M, X) ((X).uint)
#define GSI_MAP_EQUAL(M, X,Y) ((X).uint == (Y).uint)
#else
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RELEASE_KEY(X)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#define GSI_MAP_HASH(X) ((X).uint)
#define GSI_MAP_EQUAL(X,Y) ((X).uint == (Y).uint)
#endif
#include <base/GSIMap.h>
/*
* Setup for inline operation of arrays.
*/
#ifdef GSI_NEW
#define GSI_ARRAY_RETAIN(A, X)
#define GSI_ARRAY_RELEASE(A, X)
#else
#define GSI_ARRAY_RETAIN(X)
#define GSI_ARRAY_RELEASE(X)
#endif
#define GSI_ARRAY_TYPES GSUNION_OBJ|GSUNION_SEL|GSUNION_STR
#include <base/GSIArray.h>

View file

@ -306,10 +306,10 @@ static inline BOOL timerInvalidated(NSTimer* timer)
* Setup for inline operation of arrays.
*/
#define GSI_NEW 1
#define GSI_ARRAY_TYPES GSUNION_OBJ
#ifdef GSI_NEW
#if GS_WITH_GC == 0
#define GSI_ARRAY_RELEASE(A, X) [(X).obj release]
#define GSI_ARRAY_RETAIN(A, X) [(X).obj retain]
@ -318,6 +318,18 @@ static inline BOOL timerInvalidated(NSTimer* timer)
#define GSI_ARRAY_RETAIN(A, X)
#endif
#else
#if GS_WITH_GC == 0
#define GSI_ARRAY_RELEASE(X) [(X).obj release]
#define GSI_ARRAY_RETAIN(X) [(X).obj retain]
#else
#define GSI_ARRAY_RELEASE(X)
#define GSI_ARRAY_RETAIN(X)
#endif
#endif
#include <base/GSIArray.h>
static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1)

View file

@ -50,21 +50,34 @@
/*
* Setup for inline operation of string map tables.
*/
#define GSI_NEW 1
#ifdef GSI_NEW
#define GSI_MAP_RETAIN_KEY(M, X)
#define GSI_MAP_RELEASE_KEY(M, X)
#define GSI_MAP_RETAIN_VAL(M, X)
#define GSI_MAP_RELEASE_VAL(M, X)
#define GSI_MAP_HASH(M, X) [(X).obj hash]
#define GSI_MAP_EQUAL(M, X,Y) [(X).obj isEqualToString: (Y).obj]
#else
#define GSI_MAP_RETAIN_KEY(X)
#define GSI_MAP_RELEASE_KEY(X)
#define GSI_MAP_RETAIN_VAL(X)
#define GSI_MAP_RELEASE_VAL(X)
#define GSI_MAP_HASH(X) [(X).obj hash]
#define GSI_MAP_EQUAL(X,Y) [(X).obj isEqualToString: (Y).obj]
#endif
#include <base/GSIMap.h>
/*
* Setup for inline operation of string arrays.
*/
#ifdef GSI_NEW
#define GSI_ARRAY_RETAIN(A, X)
#define GSI_ARRAY_RELEASE(A, X)
#else
#define GSI_ARRAY_RETAIN(X)
#define GSI_ARRAY_RELEASE(X)
#endif
#define GSI_ARRAY_TYPES GSUNION_OBJ
#include <base/GSIArray.h>

View file

@ -31,12 +31,16 @@
#include <Foundation/NSException.h>
#include <Foundation/NSByteOrder.h>
#define GSI_NEW 1
/*
* Setup for inline operation of arrays.
*/
#ifdef GSI_NEW
#define GSI_ARRAY_RETAIN(A, X)
#define GSI_ARRAY_RELEASE(A, X)
#else
#define GSI_ARRAY_RETAIN(X)
#define GSI_ARRAY_RELEASE(X)
#endif
#define GSI_ARRAY_TYPES GSUNION_OBJ|GSUNION_SEL|GSUNION_STR
#include <base/GSIArray.h>