[Bf-blender-cvs] [a039f2b] master: Macros: prevent instantiation of args for type checks

Campbell Barton noreply at git.blender.org
Mon Aug 4 03:24:19 CEST 2014


Commit: a039f2bfc468ae293b1aa3643419f91c1723f5c9
Author: Campbell Barton
Date:   Mon Aug 4 11:14:20 2014 +1000
Branches: master
https://developer.blender.org/rBa039f2bfc468ae293b1aa3643419f91c1723f5c9

Macros: prevent instantiation of args for type checks

also make CHECK_TYPE_INLINE more strict

===================================================================

M	source/blender/blenlib/BLI_stackdefines.h
M	source/blender/blenlib/BLI_utildefines.h
M	source/blender/makesdna/DNA_ID.h

===================================================================

diff --git a/source/blender/blenlib/BLI_stackdefines.h b/source/blender/blenlib/BLI_stackdefines.h
index 24cb043..da9bf5e 100644
--- a/source/blender/blenlib/BLI_stackdefines.h
+++ b/source/blender/blenlib/BLI_stackdefines.h
@@ -36,7 +36,7 @@
 #  define _STACK_SWAP_TOTALLOC(stack_a, stack_b) SWAP(unsigned int, _##stack_a##_totalloc, _##stack_b##_totalloc)
 #else
 #  define STACK_DECLARE(stack)   unsigned int _##stack##_index
-#  define STACK_INIT(stack, tot) ((void)stack, (void)((_##stack##_index) = 0), (void)(tot))
+#  define STACK_INIT(stack, tot) ((void)stack, (void)((_##stack##_index) = 0), (void)(0 ? tot : 0))
 #  define _STACK_SIZETEST(stack, off) (void)(stack), (void)(off)
 #  define _STACK_SWAP_TOTALLOC(stack_a, stack_b) (void)(stack_a), (void)(stack_b)
 #endif
@@ -57,9 +57,12 @@
 #define STACK_PEEK_PTR(stack)       (BLI_assert(_##stack##_index), &((stack)[_##stack##_index - 1]))
 /** remove any item from the stack, take care, re-orders */
 #define STACK_REMOVE(stack, i) \
-	_STACK_BOUNDSTEST(stack, i); \
-	if (--_##stack##_index != i) { \
-		stack[i] = stack[_##stack##_index]; \
+	{ \
+		const unsigned int _i = i; \
+		_STACK_BOUNDSTEST(stack, _i); \
+		if (--_##stack##_index != _i) { \
+			stack[_i] = stack[_##stack##_index]; \
+		} \
 	} (void)0
 #ifdef __GNUC__
 #define STACK_SWAP(stack_a, stack_b) { \
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index fcc7ac3..1f34156 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -59,7 +59,6 @@
 #define VA_NARGS_CALL_OVERLOAD(name, ...) \
 	_VA_NARGS_GLUE(_VA_NARGS_OVERLOAD_MACRO(name, _VA_NARGS_COUNT_MAX16(__VA_ARGS__)), (__VA_ARGS__))
 
-
 /* useful for finding bad use of min/max */
 #if 0
 /* gcc only */
@@ -181,8 +180,14 @@
 #endif
 
 /* can be used in simple macros */
-#define CHECK_TYPE_INLINE(val, type) \
-	((void)(((type)0) != (val)))
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
+#  define CHECK_TYPE_INLINE(val, type) \
+	(void)((void)(((type)0) != (0 ? (val) : ((type)0))), \
+	       _Generic((val), type: 0, const type: 0))
+#else
+#  define CHECK_TYPE_INLINE(val, type) \
+	((void)(((type)0) != (0 ? (val) : ((type)0))))
+#endif
 
 #define CHECK_TYPE_NONCONST(var)  {      \
 	void *non_const = 0 ? (var) : NULL;  \
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index cb6d17a..1ba24f5 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -237,7 +237,7 @@ typedef struct PreviewImage {
 #  undef GS
 #endif
 // #define GS(a)	(*((short *)(a)))
-#define GS(a)	(CHECK_TYPE_INLINE(a, const char *), (*((short *)(a))))
+#define GS(a)	(CHECK_TYPE_INLINE(a, char *), (*((short *)(a))))
 
 #define ID_NEW(a)		if (      (a) && (a)->id.newid ) (a) = (void *)(a)->id.newid
 #define ID_NEW_US(a)	if (      (a)->id.newid)       { (a) = (void *)(a)->id.newid;       (a)->id.us++; }




More information about the Bf-blender-cvs mailing list