[Bf-blender-cvs] [864a53e2769] master: Fix gradient tool crash with recent changes

Campbell Barton noreply at git.blender.org
Sun Oct 1 16:24:04 CEST 2017


Commit: 864a53e276967359714723d6c3b700ae4dfb7f8c
Author: Campbell Barton
Date:   Mon Oct 2 01:34:51 2017 +1100
Branches: master
https://developer.blender.org/rB864a53e276967359714723d6c3b700ae4dfb7f8c

Fix gradient tool crash with recent changes

Having gesture automatic free memory isn't practical if this
has it's own allocations.

Add option not to free userdata.

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

M	source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_gesture.c

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

diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
index 4e807ccb4ef..9483a12aa6a 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
@@ -671,15 +671,14 @@ static void gradientVertInit__mapFunc(
 
 static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
-	int ret = WM_gesture_straightline_modal(C, op, event);
 	wmGesture *gesture = op->customdata;
 	DMGradient_vertStoreBase *vert_cache = gesture->userdata;
-	bool do_gesture_free = false;
+	int ret = WM_gesture_straightline_modal(C, op, event);
 
 	if (ret & OPERATOR_RUNNING_MODAL) {
 		if (event->type == LEFTMOUSE && event->val == KM_RELEASE) {  /* XXX, hardcoded */
 			/* generally crap! redo! */
-			do_gesture_free = true;
+			WM_gesture_straightline_cancel(C, op);
 			ret &= ~OPERATOR_RUNNING_MODAL;
 			ret |= OPERATOR_FINISHED;
 		}
@@ -693,16 +692,14 @@ static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEven
 			BKE_defvert_array_copy(me->dvert, vert_cache->wpp.wpaint_prev, me->totvert);
 			wpaint_prev_destroy(&vert_cache->wpp);
 		}
+		MEM_freeN(vert_cache);
 
 		DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 		WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 	}
 	else if (ret & OPERATOR_FINISHED) {
 		wpaint_prev_destroy(&vert_cache->wpp);
-	}
-
-	if (do_gesture_free) {
-		WM_gesture_straightline_cancel(C, op);
+		MEM_freeN(vert_cache);
 	}
 
 	return ret;
@@ -733,6 +730,7 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
 			        sizeof(DMGradient_vertStoreBase) +
 			        (sizeof(DMGradient_vertStore) * me->totvert),
 			        __func__);
+			gesture->userdata_free = false;
 			data.is_init = true;
 
 			wpaint_prev_create(&((DMGradient_vertStoreBase *)gesture->userdata)->wpp, me->dvert, me->totvert);
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 97f9257b4cb..f6049f10378 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -423,6 +423,7 @@ typedef struct wmGesture {
 
 	/* free pointer to use for operator allocs (if set, its freed on exit)*/
 	void *userdata;
+	bool  userdata_free;
 } wmGesture;
 
 /* ************** wmEvent ************************ */
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index e04571fe572..cc48b162352 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -71,6 +71,7 @@ wmGesture *WM_gesture_new(bContext *C, const wmEvent *event, int type)
 	gesture->type = type;
 	gesture->event_type = event->type;
 	gesture->swinid = ar->swinid;    /* means only in area-region context! */
+	gesture->userdata_free = true;   /* Free if userdata is set. */
 	
 	wm_subwindow_origin_get(window, gesture->swinid, &sx, &sy);
 	
@@ -114,7 +115,7 @@ void WM_gesture_end(bContext *C, wmGesture *gesture)
 		win->tweak = NULL;
 	BLI_remlink(&win->gesture, gesture);
 	MEM_freeN(gesture->customdata);
-	if (gesture->userdata) {
+	if (gesture->userdata && gesture->userdata_free) {
 		MEM_freeN(gesture->userdata);
 	}
 	MEM_freeN(gesture);



More information about the Bf-blender-cvs mailing list