[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60520] trunk/blender/source/blender/bmesh /intern/bmesh_iterators.c: add debug mode assert if mesh-data is removed while iterating over it.

Campbell Barton ideasman42 at gmail.com
Thu Oct 3 08:12:44 CEST 2013


Revision: 60520
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60520
Author:   campbellbarton
Date:     2013-10-03 06:12:44 +0000 (Thu, 03 Oct 2013)
Log Message:
-----------
add debug mode assert if mesh-data is removed while iterating over it. (can crash).

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_iterators.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_iterators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_iterators.c	2013-10-03 05:37:49 UTC (rev 60519)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_iterators.c	2013-10-03 06:12:44 UTC (rev 60520)
@@ -304,36 +304,66 @@
  * VERT OF MESH CALLBACKS
  */
 
+/* see bug [#36923] for why we need this,
+ * allow adding but not removing, this isnt _totally_ safe since
+ * you could add/remove within the same loop, but catches common cases
+ */
+#ifdef DEBUG
+#  define USE_IMMUTABLE_ASSERT
+#endif
+
 void bmiter__vert_of_mesh_begin(struct BMIter__vert_of_mesh *iter)
 {
+#ifdef USE_IMMUTABLE_ASSERT
+	((BMIter *)iter)->count = iter->bm->totvert;
+#endif
 	BLI_mempool_iternew(iter->bm->vpool, &iter->pooliter);
 }
 
 void *bmiter__vert_of_mesh_step(struct BMIter__vert_of_mesh *iter)
 {
+#ifdef USE_IMMUTABLE_ASSERT
+	BLI_assert(((BMIter *)iter)->count <= iter->bm->totvert);
+#endif
 	return BLI_mempool_iterstep(&iter->pooliter);
 }
 
 void bmiter__edge_of_mesh_begin(struct BMIter__edge_of_mesh *iter)
 {
+#ifdef USE_IMMUTABLE_ASSERT
+	((BMIter *)iter)->count = iter->bm->totedge;
+#endif
 	BLI_mempool_iternew(iter->bm->epool, &iter->pooliter);
 }
 
 void  *bmiter__edge_of_mesh_step(struct BMIter__edge_of_mesh *iter)
 {
+#ifdef USE_IMMUTABLE_ASSERT
+	BLI_assert(((BMIter *)iter)->count <= iter->bm->totedge);
+#endif
 	return BLI_mempool_iterstep(&iter->pooliter);
 }
 
 void  bmiter__face_of_mesh_begin(struct BMIter__face_of_mesh *iter)
 {
+#ifdef USE_IMMUTABLE_ASSERT
+	((BMIter *)iter)->count = iter->bm->totface;
+#endif
 	BLI_mempool_iternew(iter->bm->fpool, &iter->pooliter);
 }
 
 void  *bmiter__face_of_mesh_step(struct BMIter__face_of_mesh *iter)
 {
+#ifdef USE_IMMUTABLE_ASSERT
+	BLI_assert(((BMIter *)iter)->count <= iter->bm->totface);
+#endif
 	return BLI_mempool_iterstep(&iter->pooliter);
 }
 
+#ifdef USE_IMMUTABLE_ASSERT
+#  undef USE_IMMUTABLE_ASSERT
+#endif
+
 /*
  * EDGE OF VERT CALLBACKS
  */




More information about the Bf-blender-cvs mailing list