make SWAP macros typesafe using CHECK_TYPE macro.
authorCampbell Barton <ideasman42@gmail.com>
Sat, 25 Aug 2012 20:16:08 +0000 (20:16 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 25 Aug 2012 20:16:08 +0000 (20:16 +0000)
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()

source/blender/blenkernel/intern/curve.c
source/blender/blenlib/BLI_math_base.h
source/blender/blenlib/BLI_utildefines.h
source/blender/makesrna/intern/rna_object.c

index 664172f28514829f89d22abac018672cfd2af0d4..a2f88781cbb7760545bb0e0ac1b58c4f781d45b0 100644 (file)
@@ -3047,29 +3047,6 @@ void BKE_nurbList_handles_set(ListBase *editnurb, short code)
        }
 }
 
-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 @@ void BKE_nurb_direction_switch(Nurb *nu)
        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,12 +3065,15 @@ void BKE_nurb_direction_switch(Nurb *nu)
                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);
+                       }
+
+                       swap_v3_v3(bezt1->vec[0], bezt1->vec[2]);
 
-                       swapdata(bezt1->vec[0], bezt1->vec[2], 12);
-                       if (bezt1 != bezt2)
-                               swapdata(bezt2->vec[0], bezt2->vec[2], 12);
+                       if (bezt1 != bezt2) {
+                               swap_v3_v3(bezt2->vec[0], bezt2->vec[2]);
+                       }
 
                        SWAP(char, bezt1->h1, bezt1->h2);
                        SWAP(char, bezt1->f1, bezt1->f3);
index b0e0d3cbf198207f186d6e7f8abc646939e66fb0..4a89776a52e193690d6c6b2f5cf7be2792b18468 100644 (file)
 #  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
index 78d54defafda2ea3845cbd81d0c3aea89a70f8f9..8a459b9b07c668374e2aee890e112d7ed93b796a 100644 (file)
 
 /* 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) )
index 6dd75e94398fda97067d168b663521732f8905a4..e69d313b23b9d3b10629fb5627ac685860f4b81c 100644 (file)
@@ -313,7 +313,7 @@ static void rna_Object_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
        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;