Commit: d19d1b549746238c4c1a694a8d3781a1fd0cf49d
Author: Campbell Barton
Date:   Tue Jun 24 23:50:12 2014 +1000
https://developer.blender.org/rBd19d1b549746238c4c1a694a8d3781a1fd0cf49d

Add MEMCPY_STRUCT_OFS macro for copying values after a struct member

use for DM_to_mesh to avoid clobbering the ListBase

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

M       source/blender/blenkernel/intern/DerivedMesh.c
M       source/blender/blenlib/BLI_utildefines.h

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

diff --git a/source/blender/blenkernel/intern/DerivedMesh.c 
b/source/blender/blenkernel/intern/DerivedMesh.c
index 7a91c01..74907fd 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -615,7 +615,8 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob, 
CustomDataMask mask)
                MEM_freeN(me->mselect);
        }
 
-       *me = tmp;
+       /* skip the listbase */
+       MEMCPY_STRUCT_OFS(me, &tmp, id.prev);
 }
 
 void DM_to_meshkey(DerivedMesh *dm, Mesh *me, KeyBlock *kb)
diff --git a/source/blender/blenlib/BLI_utildefines.h 
b/source/blender/blenlib/BLI_utildefines.h
index 4333ef1..c464bcd 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -384,6 +384,21 @@
 #  define ARRAY_SIZE(arr)  (sizeof(arr) / sizeof(*(arr)))
 #endif
 
+/* Like offsetof(typeof(), member), for non-gcc compilers */
+#define OFFSETOF_STRUCT(_struct, _member) \
+       ((((char *)&((_struct)->_member)) - ((char *)(_struct))) + 
sizeof((_struct)->_member))
+
+/* memcpy, skipping the first part of a struct,
+ * ensures 'struct_dst' isn't const and that the offset can be computed at 
compile time */
+#define MEMCPY_STRUCT_OFS(struct_dst, struct_src, member)  { \
+       void *_not_const = struct_dst; \
+       (void)_not_const; \
+       ((void)(struct_dst == struct_src), \
+        memcpy((char *)(struct_dst)  + OFFSETOF_STRUCT(struct_dst, member), \
+               (char *)(struct_src)  + OFFSETOF_STRUCT(struct_dst, member), \
+               sizeof(*(struct_dst)) - OFFSETOF_STRUCT(struct_dst, member))); \
+} (void)0
+
 /* Warning-free macros for storing ints in pointers. Use these _only_
  * for storing an int in a pointer, not a pointer in an int (64bit)! */
 #define SET_INT_IN_POINTER(i)    ((void *)(intptr_t)(i))

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

Reply via email to