From 6a2f46a0855f4273d88c873859a9516999e69d01 Mon Sep 17 00:00:00 2001 From: rfm Date: Thu, 27 Jun 2013 06:42:42 +0000 Subject: [PATCH] double retain bugfix git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@36762 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 5 +++++ Source/NSConcreteMapTable.m | 39 +++++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index bd3110892..37bed6453 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-06-27 Richard Frith-Macdonald + + * Source/NSConcreteMapTable.m: attempt to fix double retain bug + introduced by clang/ARC changes. + 2013-06-24 Wolfgang Lux * Tools/AGSIndex.m (mergeDictionaries): Fix typo in warning. diff --git a/Source/NSConcreteMapTable.m b/Source/NSConcreteMapTable.m index 75eb27b19..03c95fbd7 100644 --- a/Source/NSConcreteMapTable.m +++ b/Source/NSConcreteMapTable.m @@ -98,27 +98,42 @@ typedef GSIMapNode_t *GSIMapNode; (M->legacy ? M->cb.old.v.retain(M, X.ptr) \ : pointerFunctionsAcquire(&M->cb.pf.v, &X.ptr, X.ptr)) +/* 2013-05-25 Here are the macros originally added for GC/ARC ... + * but they caused map table entries to be doubly retained :-( + * The question is, are the new versions I hacked in below to + * fix this correct? + #define GSI_MAP_WRITE_KEY(M, addr, x) \ if (M->legacy) \ - *(addr) = x;\ + *(addr) = x;\ else\ - pointerFunctionsAssign(&M->cb.pf.k, (void**)addr, (x).obj); + pointerFunctionsAssign(&M->cb.pf.k, (void**)addr, (x).obj); #define GSI_MAP_WRITE_VAL(M, addr, x) \ if (M->legacy) \ - *(addr) = x;\ + *(addr) = x;\ else\ - pointerFunctionsAssign(&M->cb.pf.v, (void**)addr, (x).obj); + pointerFunctionsAssign(&M->cb.pf.v, (void**)addr, (x).obj); +*/ +#define GSI_MAP_WRITE_KEY(M, addr, x) \ + if (M->legacy) \ + *(addr) = x;\ + else\ + *(id*)(addr) = (x).obj; +#define GSI_MAP_WRITE_VAL(M, addr, x) \ + if (M->legacy) \ + *(addr) = x;\ + else\ + *(id*)(addr) = (x).obj; #define GSI_MAP_READ_KEY(M,addr) \ - (M->legacy ? *(addr) :\ - (typeof(*addr))pointerFunctionsRead(&M->cb.pf.k, (void**)addr)) + (M->legacy ? *(addr)\ + : (typeof(*addr))pointerFunctionsRead(&M->cb.pf.k, (void**)addr)) #define GSI_MAP_READ_VALUE(M,addr) \ - (M->legacy ? *(addr) :\ - (typeof(*addr))pointerFunctionsRead(&M->cb.pf.v, (void**)addr)) + (M->legacy ? *(addr)\ + : (typeof(*addr))pointerFunctionsRead(&M->cb.pf.v, (void**)addr)) #define GSI_MAP_ZEROED(M)\ - (M->legacy ? 0 \ - : (((M->cb.pf.k.options | M->cb.pf.v.options) & NSPointerFunctionsZeroingWeakMemory) ?\ - YES : NO)) - + (M->legacy ? 0\ + : (((M->cb.pf.k.options | M->cb.pf.v.options)\ + & NSPointerFunctionsZeroingWeakMemory) ? YES : NO)) #define GSI_MAP_ENUMERATOR NSMapEnumerator