[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