[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23223] trunk/blender/source/blender: Bugfix with py operator api and modal operators.
Martin Poirier
theeth at yahoo.com
Mon Sep 14 18:00:42 CEST 2009
Revision: 23223
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23223
Author: theeth
Date: 2009-09-14 18:00:42 +0200 (Mon, 14 Sep 2009)
Log Message:
-----------
Bugfix with py operator api and modal operators. Modal operators would keep a reference to Reports locally allocated in the api functions, which would crash and burn later when the operator would actually stop.
This commit introduces a flag at the Reports level that can be used to indicate that it needs to be freed (on top of the flag already existing in the operator, which I guess could be removed).
Reports for operators called through python are only persisted if they indicate that they are running modal.
Modified Paths:
--------------
trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
trunk/blender/source/blender/python/intern/bpy_operator.c
trunk/blender/source/blender/windowmanager/intern/wm.c
trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
Modified: trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h 2009-09-14 14:55:49 UTC (rev 23222)
+++ trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h 2009-09-14 16:00:42 UTC (rev 23223)
@@ -80,6 +80,7 @@
enum ReportListFlags {
RPT_PRINT = 1,
RPT_STORE = 2,
+ RPT_FREE = 4,
};
typedef struct Report {
struct Report *next, *prev;
Modified: trunk/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_operator.c 2009-09-14 14:55:49 UTC (rev 23222)
+++ trunk/blender/source/blender/python/intern/bpy_operator.c 2009-09-14 16:00:42 UTC (rev 23223)
@@ -79,16 +79,21 @@
if (error_val==0) {
- ReportList reports;
+ ReportList *reports;
- BKE_reports_init(&reports, RPT_STORE);
+ reports= MEM_mallocN(sizeof(ReportList), "wmOperatorReportList");
+ BKE_reports_init(reports, RPT_STORE);
- WM_operator_call_py(C, ot, context, &ptr, &reports);
+ WM_operator_call_py(C, ot, context, &ptr, reports);
- if(BPy_reports_to_error(&reports))
+ if(BPy_reports_to_error(reports))
error_val = -1;
- BKE_reports_clear(&reports);
+ BKE_reports_clear(reports);
+ if ((reports->flag & RPT_FREE) == 0)
+ {
+ MEM_freeN(reports);
+ }
}
WM_operator_properties_free(&ptr);
Modified: trunk/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm.c 2009-09-14 14:55:49 UTC (rev 23222)
+++ trunk/blender/source/blender/windowmanager/intern/wm.c 2009-09-14 16:00:42 UTC (rev 23223)
@@ -69,7 +69,7 @@
MEM_freeN(op->properties);
}
- if(op->reports && (op->flag & OPERATOR_REPORT_FREE)) {
+ if(op->reports && ((op->flag & OPERATOR_REPORT_FREE) || (op->reports->flag & RPT_FREE))) {
BKE_reports_clear(op->reports);
MEM_freeN(op->reports);
}
Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2009-09-14 14:55:49 UTC (rev 23222)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2009-09-14 16:00:42 UTC (rev 23223)
@@ -555,6 +555,11 @@
retval= wm_operator_call_internal(C, ot, context, properties, reports);
+ if (retval & OPERATOR_RUNNING_MODAL)
+ {
+ reports->flag |= RPT_FREE;
+ }
+
return retval;
}
More information about the Bf-blender-cvs
mailing list