[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50208] trunk/blender/source/blender: make SWAP macros typesafe using CHECK_TYPE macro.

Campbell Barton ideasman42 at gmail.com
Sat Aug 25 22:16:09 CEST 2012


Revision: 50208
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50208
Author:   campbellbarton
Date:     2012-08-25 20:16:08 +0000 (Sat, 25 Aug 2012)
Log Message:
-----------
make SWAP macros typesafe using CHECK_TYPE macro.

Its unlikely you want to do short -> int, int -> float etc, conversion during swapping (if its needed we could have a non type checking macro).

Double that the optimized assembler outbut using SWAP() remains unchanged from before.

This exposed quite a few places where redundant type conversion was going on.

Also remove curve.c's swapdata() and replace its use with swap_v3_v3()

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenlib/BLI_math_base.h
    trunk/blender/source/blender/blenlib/BLI_utildefines.h
    trunk/blender/source/blender/makesrna/intern/rna_object.c

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2012-08-25 19:43:15 UTC (rev 50207)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2012-08-25 20:16:08 UTC (rev 50208)
@@ -3047,29 +3047,6 @@
 	}
 }
 
-static void swapdata(void *adr1, void *adr2, int len)
-{
-
-	if (len <= 0) return;
-
-	if (len < 65) {
-		char adr[64];
-
-		memcpy(adr, adr1, len);
-		memcpy(adr1, adr2, len);
-		memcpy(adr2, adr, len);
-	}
-	else {
-		char *adr;
-
-		adr = (char *)MEM_mallocN(len, "curve swap");
-		memcpy(adr, adr1, len);
-		memcpy(adr1, adr2, len);
-		memcpy(adr2, adr, len);
-		MEM_freeN(adr);
-	}
-}
-
 void BKE_nurb_direction_switch(Nurb *nu)
 {
 	BezTriple *bezt1, *bezt2;
@@ -3077,7 +3054,9 @@
 	float *fp1, *fp2, *tempf;
 	int a, b;
 
-	if (nu->pntsu == 1 && nu->pntsv == 1) return;
+	if (nu->pntsu == 1 && nu->pntsv == 1) {
+		return;
+	}
 
 	if (nu->type == CU_BEZIER) {
 		a = nu->pntsu;
@@ -3086,13 +3065,16 @@
 		if (a & 1) a += 1;  /* if odd, also swap middle content */
 		a /= 2;
 		while (a > 0) {
-			if (bezt1 != bezt2)
+			if (bezt1 != bezt2) {
 				SWAP(BezTriple, *bezt1, *bezt2);
+			}
 
-			swapdata(bezt1->vec[0], bezt1->vec[2], 12);
-			if (bezt1 != bezt2)
-				swapdata(bezt2->vec[0], bezt2->vec[2], 12);
+			swap_v3_v3(bezt1->vec[0], bezt1->vec[2]);
 
+			if (bezt1 != bezt2) {
+				swap_v3_v3(bezt2->vec[0], bezt2->vec[2]);
+			}
+
 			SWAP(char, bezt1->h1, bezt1->h2);
 			SWAP(char, bezt1->f1, bezt1->f3);
 

Modified: trunk/blender/source/blender/blenlib/BLI_math_base.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_base.h	2012-08-25 19:43:15 UTC (rev 50207)
+++ trunk/blender/source/blender/blenlib/BLI_math_base.h	2012-08-25 20:16:08 UTC (rev 50208)
@@ -137,8 +137,30 @@
 #  endif
 #endif
 
+/* Causes warning:
+ * incompatible types when assigning to type 'Foo' from type 'Bar'
+ * ... the compiler optimizes away the temp var */
+#ifndef CHECK_TYPE
+#ifdef __GNUC__
+#define CHECK_TYPE(var, type)  {  \
+	__typeof(var) *__tmp;         \
+	__tmp = (type *)NULL;         \
+	(void)__tmp;                  \
+} (void)0
+#else
+#define CHECK_TYPE(var, type)
+#endif
+#endif
+
 #ifndef SWAP
-#  define SWAP(type, a, b)  { type sw_ap; sw_ap = (a); (a) = (b); (b) = sw_ap; } (void)0
+#  define SWAP(type, a, b)  {  \
+	type sw_ap;                \
+	CHECK_TYPE(a, type);       \
+	CHECK_TYPE(b, type);       \
+	sw_ap = (a);               \
+	(a) = (b);                 \
+	(b) = sw_ap;               \
+} (void)0
 #endif
 
 #ifndef CLAMP

Modified: trunk/blender/source/blender/blenlib/BLI_utildefines.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_utildefines.h	2012-08-25 19:43:15 UTC (rev 50207)
+++ trunk/blender/source/blender/blenlib/BLI_utildefines.h	2012-08-25 20:16:08 UTC (rev 50208)
@@ -113,8 +113,30 @@
 
 /* some math and copy defines */
 
+/* Causes warning:
+ * incompatible types when assigning to type 'Foo' from type 'Bar'
+ * ... the compiler optimizes away the temp var */
+#ifndef CHECK_TYPE
+#ifdef __GNUC__
+#define CHECK_TYPE(var, type)  {  \
+	__typeof(var) *__tmp;         \
+	__tmp = (type *)NULL;         \
+	(void)__tmp;                  \
+} (void)0
+#else
+#define CHECK_TYPE(var, type)
+#endif
+#endif
+
 #ifndef SWAP
-#  define SWAP(type, a, b)       { type sw_ap; sw_ap = (a); (a) = (b); (b) = sw_ap; } (void)0
+#  define SWAP(type, a, b)  {  \
+	type sw_ap;                \
+	CHECK_TYPE(a, type);       \
+	CHECK_TYPE(b, type);       \
+	sw_ap = (a);               \
+	(a) = (b);                 \
+	(b) = sw_ap;               \
+} (void)0
 #endif
 
 #define ABS(a)          ( (a) < 0 ? (-(a)) : (a) )

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2012-08-25 19:43:15 UTC (rev 50207)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2012-08-25 20:16:08 UTC (rev 50208)
@@ -313,7 +313,7 @@
 	if (!base)
 		return;
 	
-	SWAP(int, base->lay, ob->lay);
+	SWAP(unsigned int, base->lay, ob->lay);
 
 	rna_Object_layer_update__internal(bmain, scene, base, ob);
 	ob->lay = base->lay;




More information about the Bf-blender-cvs mailing list