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;
 }
 


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

Reply via email to