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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to