[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19901] branches/blender2.5/blender/source /blender/python/intern: - fix for python refcounting crashes, remember PyDict_GetItem and PyDict_GetItemString borrow a ref.
Campbell Barton
ideasman42 at gmail.com
Thu Apr 23 11:15:42 CEST 2009
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);
}
More information about the Bf-blender-cvs
mailing list