[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45013] trunk/blender/source/blender/ python/intern/bpy_rna.c: py api:
Campbell Barton
ideasman42 at gmail.com
Tue Mar 20 04:13:38 CET 2012
Revision: 45013
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45013
Author: campbellbarton
Date: 2012-03-20 03:13:25 +0000 (Tue, 20 Mar 2012)
Log Message:
-----------
py api:
fix for collection functions not showing up in __dir__,
eg, console autocomplete didnt show up bpy.data.libraries.load
also fix refcounting leak with returning attributes from collections.
Modified Paths:
--------------
trunk/blender/source/blender/python/intern/bpy_rna.c
Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c 2012-03-20 02:17:37 UTC (rev 45012)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c 2012-03-20 03:13:25 UTC (rev 45013)
@@ -3282,26 +3282,43 @@
return pyrna_struct_CreatePyObject(&r_ptr);
}
+static void pyrna_dir_members_py__add_keys(PyObject *list, PyObject *dict)
+{
+ PyObject *list_tmp;
+
+ list_tmp = PyDict_Keys(dict);
+ PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
+ Py_DECREF(list_tmp);
+}
+
static void pyrna_dir_members_py(PyObject *list, PyObject *self)
{
PyObject *dict;
PyObject **dict_ptr;
- PyObject *list_tmp;
dict_ptr = _PyObject_GetDictPtr((PyObject *)self);
if (dict_ptr && (dict = *dict_ptr)) {
- list_tmp = PyDict_Keys(dict);
- PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
- Py_DECREF(list_tmp);
+ pyrna_dir_members_py__add_keys(list, dict);
}
dict = ((PyTypeObject *)Py_TYPE(self))->tp_dict;
if (dict) {
- list_tmp = PyDict_Keys(dict);
- PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
- Py_DECREF(list_tmp);
+ pyrna_dir_members_py__add_keys(list, dict);
}
+
+ /* since this is least common case, handle it last */
+ if (BPy_PropertyRNA_Check(self)) {
+ BPy_PropertyRNA *self_prop = (BPy_PropertyRNA *)self;
+ PointerRNA r_ptr;
+
+ if (RNA_property_collection_type_get(&self_prop->ptr, self_prop->prop, &r_ptr)) {
+ PyObject *cls = pyrna_struct_Subtype(&r_ptr); /* borrows */
+ dict = ((PyTypeObject *)cls)->tp_dict;
+ pyrna_dir_members_py__add_keys(list, dict);
+ Py_DECREF(cls);
+ }
+ }
}
static void pyrna_dir_members_rna(PyObject *list, PointerRNA *ptr)
@@ -3770,8 +3787,10 @@
PyErr_Fetch(&error_type, &error_value, &error_traceback);
PyErr_Clear();
- cls = pyrna_struct_Subtype(&r_ptr); /* borrows */
+ cls = pyrna_struct_Subtype(&r_ptr);
ret = PyObject_GenericGetAttr(cls, pyname);
+ Py_DECREF(cls);
+
/* restore the original error */
if (ret == NULL) {
PyErr_Restore(error_type, error_value, error_traceback);
More information about the Bf-blender-cvs
mailing list