bad use of assignment within ABS() caused SMHASH_NEXT macro to step the offset twice...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 6 Nov 2012 04:17:46 +0000 (04:17 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 6 Nov 2012 04:17:46 +0000 (04:17 +0000)
source/blender/blenlib/intern/smallhash.c

index 92125c6e9880e98376f1522bf0a82ed0839dd96f..64bb503fa3cb3c0d67b9ec87ce2d1c3a34f17166 100644 (file)
 #define SMHASH_CELL_UNUSED  ((void *)0x7FFFFFFF)
 #define SMHASH_CELL_FREE    ((void *)0x7FFFFFFD)
 
-#define SMHASH_NONZERO(n) ((n) + !(n))
-#define SMHASH_NEXT(h, hoff) ABS(((h) + ((hoff = SMHASH_NONZERO(hoff * 2) + 1), hoff)))
+BLI_INLINE int smhash_nonzero(const int n)
+{
+       return n + !n;
+}
+
+BLI_INLINE int smhash_abs_i(const int n)
+{
+       return (n > 0) ? n : -n;
+}
+
+/* typically this re-assigns 'h' */
+#define SMHASH_NEXT(h, hoff)  ( \
+       CHECK_TYPE_INLINE(&(h),    int), \
+       CHECK_TYPE_INLINE(&(hoff), int), \
+       smhash_abs_i((h) + (((hoff) = smhash_nonzero((hoff) * 2) + 1), (hoff))) \
+       )
 
 extern unsigned int hashsizes[];