[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49650] trunk/blender/source/blender/ editors/mesh/editmesh_knife.c: Fix knife stack overflow (bug #31907).

Howard Trickey howard.trickey at gmail.com
Tue Aug 7 14:54:32 CEST 2012


Revision: 49650
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49650
Author:   howardt
Date:     2012-08-07 12:54:32 +0000 (Tue, 07 Aug 2012)
Log Message:
-----------
Fix knife stack overflow (bug #31907).
The mutual recursion was removed: it was not needed.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editmesh_knife.c

Modified: trunk/blender/source/blender/editors/mesh/editmesh_knife.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_knife.c	2012-08-07 12:09:48 UTC (rev 49649)
+++ trunk/blender/source/blender/editors/mesh/editmesh_knife.c	2012-08-07 12:54:32 UTC (rev 49650)
@@ -339,14 +339,13 @@
 	return kfv;
 }
 
-/**
- * get a KnifeEdge wrapper for an existing BMEdge
- * \note #knife_get_face_kedges / #get_bm_knife_edge are called recursively - KEEP STACK MEM USAGE LOW */
+/* get a KnifeEdge wrapper for an existing BMEdge */
 static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e)
 {
 	KnifeEdge *kfe = BLI_ghash_lookup(kcd->origedgemap, e);
 	if (!kfe) {
-		BMLoop *l_iter, *l_first;
+		BMIter bmiter;
+		BMFace *f;
 
 		kfe = new_knife_edge(kcd);
 		kfe->e = e;
@@ -357,17 +356,9 @@
 
 		BLI_ghash_insert(kcd->origedgemap, e, kfe);
 
-		/* avoid BM_ITER because of stack memory usage
-		 * otherwise we could use BM_FACES_OF_EDGE */
-		l_iter = l_first = e->l;
-		do {
-			knife_append_list(kcd, &kfe->faces, l_iter->f);
-
-			/* ensures the kedges lst for this f is initialized,
-			 * it automatically adds kfe by itself */
-			knife_get_face_kedges(kcd, l_iter->f);
-
-		} while ((l_iter = l_iter->radial_next) != l_first);
+		BM_ITER_ELEM(f, &bmiter, e, BM_FACES_OF_EDGE) {
+			knife_append_list(kcd, &kfe->faces, f);
+		}
 	}
 
 	return kfe;
@@ -397,23 +388,19 @@
 	}
 }
 
-/**
- * \note #knife_get_face_kedges / #get_bm_knife_edge are called recursively - KEEP STACK MEM USAGE LOW */
 static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, BMFace *f)
 {
 	ListBase *lst = BLI_ghash_lookup(kcd->kedgefacemap, f);
 
 	if (!lst) {
-		BMLoop *l_iter, *l_first;
+		BMIter bmiter;
+		BMEdge *e;
 
 		lst = knife_empty_list(kcd);
 
-		/* avoid BM_ITER because of stack memory usage
-		 * otherwise we could use BM_EDGES_OF_FACE */
-		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-		do {
-			knife_append_list(kcd, lst, get_bm_knife_edge(kcd, l_iter->e));
-		} while ((l_iter = l_iter->next) != l_first);
+		BM_ITER_ELEM(e, &bmiter, f, BM_EDGES_OF_FACE) {
+			knife_append_list(kcd, lst, get_bm_knife_edge(kcd, e));
+		}
 
 		BLI_ghash_insert(kcd->kedgefacemap, f, lst);
 	}




More information about the Bf-blender-cvs mailing list