Revision: 19901
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19901
Author:   campbellbarton
Date:     2009-04-23 11:15:42 +0200 (Thu, 23 Apr 2009)

Log Message:
-----------
- fix for python refcounting crashes, remember PyDict_GetItem and 
PyDict_GetItemString borrow a ref.
- the namespace dictionary wasn't being de-allocated for each run.
- clear every error after printing it to avoid stale PyObjects hanging about.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c

Modified: 
branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c    
2009-04-23 09:08:07 UTC (rev 19900)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c    
2009-04-23 09:15:42 UTC (rev 19901)
@@ -179,7 +179,7 @@
                        MEM_freeN( buf );
 
                        if( PyErr_Occurred(  ) ) {
-                               PyErr_Print();
+                               PyErr_Print(); PyErr_Clear();
                                BPY_free_compiled_text( text );
                                PyGILState_Release(gilstate);
                                return 0;
@@ -195,10 +195,12 @@
        }
        
        if (!py_result) {
-               PyErr_Print();
+               PyErr_Print(); PyErr_Clear();
        } else {
                Py_DECREF( py_result );
        }
+       
+       Py_DECREF(py_dict);
        PyGILState_Release(gilstate);
        
        //BPY_end_python();
@@ -220,7 +222,7 @@
        script = sc->script;
 
        if( err ) {
-               PyErr_Print(  );
+               PyErr_Print(); PyErr_Clear();
                script->flags = 0;      /* mark script struct for deletion */
                SCRIPT_SET_NULL(script);
                script->scriptname[0] = '\0';
@@ -327,13 +329,14 @@
                }
        }
        
-       if (!py_result)
-               PyErr_Print();
-       else
+       if (!py_result) {
+               PyErr_Print(); PyErr_Clear();
+       } else
                Py_DECREF( py_result );
        
        Py_XDECREF(module);
        
+       Py_DECREF(py_dict);
        
        PyGILState_Release(gilstate);
        return 1;
@@ -406,7 +409,7 @@
                        if(mod) {
                                Py_DECREF(mod); /* could be NULL from reloading 
*/
                        } else {
-                               PyErr_Print();
+                               PyErr_Print(); PyErr_Clear();
                                fprintf(stderr, "unable to import \"%s\"  
%s/%s\n", path, dirname, de->d_name);
                        }
                }
@@ -527,7 +530,7 @@
        driver->flag |= DRIVER_FLAG_INVALID; /* py expression failed */
        fprintf(stderr, "\nError in Driver: The following Python expression 
failed:\n\t'%s'\n\n", driver->expression);
        
-       PyErr_Print();
+       PyErr_Print(); PyErr_Clear();
 
        return 0.0f;
 }
@@ -586,7 +589,7 @@
                        }
                        
                        fprintf(stderr, "\tBPY_pydriver_eval() - couldn't add 
variable '%s' to namespace \n", dtar->name);
-                       PyErr_Print();
+                       PyErr_Print(); PyErr_Clear();
                }
        }
        

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c  
2009-04-23 09:08:07 UTC (rev 19900)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c  
2009-04-23 09:15:42 UTC (rev 19901)
@@ -1144,7 +1144,7 @@
                        i++;
                }
                else if (kw != NULL)
-                       item= PyDict_GetItemString(kw, pid);
+                       item= PyDict_GetItemString(kw, pid);  /* borrow ref */
 
                if (item==NULL) {
                        if(flag & PROP_REQUIRED) {
@@ -1957,12 +1957,10 @@
        }
        
        /* get the context, so register callback can do necessary refreshes */
-       item= PyDict_GetItemString(PyEval_GetGlobals(), "__bpy_context__");
+       item= PyDict_GetItemString(PyEval_GetGlobals(), "__bpy_context__");  /* 
borrow ref */
 
-       if(item) {
+       if(item)
                C= (bContext*)PyCObject_AsVoidPtr(item);
-               Py_DECREF(item);
-       }
 
        /* call the register callback */
        BKE_reports_init(&reports, RPT_PRINT);
@@ -1998,18 +1996,14 @@
        }
 
        /* check we got an __rna__ attribute */
-       item= PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, 
"__rna__");
+       item= PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, 
"__rna__");  /* borrow ref */
 
        if(!item || !BPy_StructRNA_Check(item)) {
-               if(item) {
-                       Py_DECREF(item);
-               }
                PyErr_SetString(PyExc_AttributeError, "expected a Type 
subclassed from a registerable rna type (no __rna__ property).");
                return NULL;
        }
 
        /* check the __rna__ attribute has the right type */
-       Py_DECREF(item);
        py_srna= (BPy_StructRNA*)item;
 
        if(py_srna->ptr.type != &RNA_Struct) {
@@ -2026,12 +2020,10 @@
        }
        
        /* get the context, so register callback can do necessary refreshes */
-       item= PyDict_GetItemString(PyEval_GetGlobals(), "__bpy_context__");
+       item= PyDict_GetItemString(PyEval_GetGlobals(), "__bpy_context__");  /* 
borrow ref */
 
-       if(item) {
+       if(item)
                C= (bContext*)PyCObject_AsVoidPtr(item);
-               Py_DECREF(item);
-       }
 
        /* call unregister */
        unreg(C, py_srna->ptr.data);

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c   
2009-04-23 09:08:07 UTC (rev 19900)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c   
2009-04-23 09:15:42 UTC (rev 19901)
@@ -344,7 +344,7 @@
 static bContext *get_py_context__internal(void)
 {
        PyObject *globals = PyEval_GetGlobals();
-       PyObject *val= PyDict_GetItemString(globals, "__bpy_context__");
+       PyObject *val= PyDict_GetItemString(globals, "__bpy_context__"); /* 
borrow ref */
        return PyCObject_AsVoidPtr(val);
 }
 


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

Reply via email to