[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19329] branches/blender2.5/blender/source /blender/python/intern: * removed warnings and fixed some python refcount errors

Campbell Barton ideasman42 at gmail.com
Wed Mar 18 23:22:59 CET 2009


Revision: 19329
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19329
Author:   campbellbarton
Date:     2009-03-18 23:22:58 +0100 (Wed, 18 Mar 2009)

Log Message:
-----------
* removed warnings and fixed some python refcount errors
* operator class names
- Changed 'name' to '__label__' (since __name__ is already used for the class name)
- Changed 'properties' to '__props__'

* added a PyObject_GetAttrStringArgs(), utility function which Id like to see in pythons C api.
PyObject_GetAttrStringArgs(pyob, "someattr", "foo", "bar") /* pyob.someattr.foo.bar */

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

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c	2009-03-18 17:30:33 UTC (rev 19328)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c	2009-03-18 22:22:58 UTC (rev 19329)
@@ -264,6 +264,7 @@
 			PyErr_SetFormat(PyExc_SystemError, "module has no function '%s.%s'\n", scpt->script.filename, func);
 		}
 		else {
+			Py_DECREF(py_func);
 			if (!PyCallable_Check(py_func)) {
 				PyErr_SetFormat(PyExc_SystemError, "module item is not callable '%s.%s'\n", scpt->script.filename, func);
 			}

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c	2009-03-18 17:30:33 UTC (rev 19328)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c	2009-03-18 22:22:58 UTC (rev 19329)
@@ -110,7 +110,7 @@
 static PyObject *pyop_base_dir(PyObject *self);
 static struct PyMethodDef pyop_base_methods[] = {
 	{"__dir__", (PyCFunction)pyop_base_dir, METH_NOARGS, ""},
-	{"add", (PyCFunction)PYOP_wrap_add, METH_VARARGS, ""},
+	{"add", (PyCFunction)PYOP_wrap_add, METH_O, ""},
 	{"remove", (PyCFunction)PYOP_wrap_remove, METH_O, ""},
 	{NULL, NULL, 0, NULL}
 };

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_opwrapper.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_opwrapper.c	2009-03-18 17:30:33 UTC (rev 19328)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_opwrapper.c	2009-03-18 22:22:58 UTC (rev 19329)
@@ -40,6 +40,11 @@
 #include "bpy_compat.h"
 #include "bpy_util.h"
 
+#define PYOP_ATTR_PROP			"__props__"
+#define PYOP_ATTR_UINAME		"__label__"
+#define PYOP_ATTR_IDNAME		"__name__"	/* use pythons class name */
+#define PYOP_ATTR_DESCRIPTION	"__doc__"	/* use pythons docstring */
+
 typedef struct PyOperatorType {
 	void *next, *prev;
 	char idname[OP_MAX_TYPENAME];
@@ -316,17 +321,16 @@
 	
 	ot->pyop_data= userdata;
 	
-	// TODO - set properties
+	props= PyObject_GetAttrString(py_class, PYOP_ATTR_PROP);
 	
-	
-	if ((props=PyObject_GetAttrString(py_class, "properties"))) {		
+	if (props) {
 		PyObject *dummy_args = PyTuple_New(0);
-		
 		int i;
 		
+		Py_DECREF(props);
+
 		for(i=0; i<PyList_Size(props); i++) {
 			PyObject *py_func_ptr, *py_kw, *py_srna_cobject, *py_ret;
-
 			item = PyList_GET_ITEM(props, i);
 			
 			if (PyArg_ParseTuple(item, "O!O!", &PyCObject_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
@@ -360,11 +364,9 @@
 
 
 /* pyOperators - Operators defined IN Python */
-PyObject *PYOP_wrap_add(PyObject *self, PyObject *args)
-{
-	// XXX ugly - store the Operator type elsewhere!, probably leaks memory
-	PyObject *optype = PyObject_GetAttrString(PyObject_GetAttrString(PyDict_GetItemString(PyEval_GetGlobals(), "bpy"), "types"), "Operator");
-	PyObject *value, *item;
+PyObject *PYOP_wrap_add(PyObject *self, PyObject *value)
+{	
+	PyObject *optype, *item;
 	
 	PyOperatorType *pyot;
 	char *idname= NULL;
@@ -373,30 +375,37 @@
 	
 	static char *pyop_func_names[] = {"exec", "invoke", "poll", NULL};
 	static int pyop_func_nargs[] = {1, 2, 2, 0};
+
+	PyObject *pyargcount;
+	int i, argcount;
+
+
+	// in python would be...
+	//PyObject *optype = PyObject_GetAttrString(PyObject_GetAttrString(PyDict_GetItemString(PyEval_GetGlobals(), "bpy"), "types"), "Operator");
+	optype = PyObject_GetAttrStringArgs(PyDict_GetItemString(PyEval_GetGlobals(), "bpy"), 2, "types", "Operator");
+	Py_DECREF(optype);
 	
-	int i;
-	int argcount;
-	
-	if (!PyArg_ParseTuple(args, "O", &value) || !PyObject_IsSubclass(value, optype)) {
+	if (!PyObject_IsSubclass(value, optype)) {
 		PyErr_SetString( PyExc_AttributeError, "expected Operator subclass of bpy.types.Operator");
 		return NULL;
 	}
 	
 	/* class name is used for operator ID - this can be changed later if we want */
-	item = PyObject_GetAttrString(value, "__name__");
+	item = PyObject_GetAttrString(value, PYOP_ATTR_IDNAME);
+	Py_DECREF(item);
 	idname =  _PyUnicode_AsString(item);
-	Py_DECREF(item);
 	
+	
 	if (WM_operatortype_find(idname)) {
-		PyErr_Format( PyExc_AttributeError, "Operator already exists with this name: %s", idname);
+		PyErr_Format( PyExc_AttributeError, "Operator alredy exists with this name \"%s\"", idname);
 		return NULL;
 	}
 	
 	/* Operator user readible name */
-	item = PyObject_GetAttrString(value, "name");
+	item = PyObject_GetAttrString(value, PYOP_ATTR_UINAME);
 	if (item) {
+		Py_DECREF(item);
 		name = _PyUnicode_AsString(item);
-		Py_DECREF(item);
 	}
 	if (name == NULL) {
 		name = idname;
@@ -404,36 +413,37 @@
 	}
 	
 	/* use py docstring for description, should always be None or a string */
-	item = PyObject_GetAttrString(value, "__doc__");
+	item = PyObject_GetAttrString(value, PYOP_ATTR_DESCRIPTION);
+	Py_DECREF(item);
+	
 	if (PyUnicode_Check(item)) {
 		description = _PyUnicode_AsString(item);
 	}
 	else {
 		description = "";
 	}
-	Py_DECREF(item);
 	
 	/* Check known functions and argument lengths */
 	for (i=0; pyop_func_names[i]; i++) {
-		if ((item=PyObject_GetAttrString(value, pyop_func_names[i]))) {
-			PyObject *pyargcount;
+		
+		item=PyObject_GetAttrString(value, pyop_func_names[i]);
+		if (item) {
+			Py_DECREF(item);
 
 			/* check its callable */
 			if (!PyFunction_Check(item)) {
 				PyErr_Format(PyExc_ValueError, "Cant register operator class -  %s.%s() is not a function", idname, pyop_func_names[i]);
-				Py_DECREF(item);
 				return NULL;
 			}
 			/* check the number of args is correct */
-			// MyClass.exec.func_code.co_argcount
+			/* MyClass.exec.func_code.co_argcount */
 			
-			pyargcount = PyObject_GetAttrString(PyFunction_GetCode(item), "co_argcount");
+			pyargcount = PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
+			Py_DECREF(pyargcount);
 			argcount = PyLong_AsSsize_t(pyargcount);
-			Py_DECREF(pyargcount);
 			
 			if (argcount != pyop_func_nargs[i]) {
 				PyErr_Format(PyExc_ValueError, "Cant register operator class - %s.%s() takes %d args, should be %d", idname, pyop_func_names[i], argcount, pyop_func_nargs[i]);
-				Py_DECREF(item);
 				return NULL;
 			}
 			
@@ -444,13 +454,12 @@
 	}
 	
 	/* If we have properties set, check its a list of dicts */
-	item = PyObject_GetAttrString(value, "properties");
+	item = PyObject_GetAttrString(value, PYOP_ATTR_PROP);
 	if (item) {
-		int i;
+		Py_DECREF(item);
 
 		if (!PyList_Check(item)) {
-			PyErr_Format(PyExc_ValueError, "Cant register operator class - %s.properties must be a list", idname);
-			Py_DECREF(item);
+			PyErr_Format(PyExc_ValueError, "Cant register operator class - %s.properties must be a list", idname);	
 			return NULL;
 		}
 		
@@ -460,12 +469,9 @@
 			
 			if (!PyArg_ParseTuple(py_args, "O!O!", &PyCObject_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
 				PyErr_Format(PyExc_ValueError, "Cant register operator class - %s.properties must contain values from FloatProperty", idname);
-				Py_DECREF(item);
 				return NULL;				
 			}
 		}
-		
-		Py_DECREF(item);
 	}
 	else {
 		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-03-18 17:30:33 UTC (rev 19328)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-03-18 22:22:58 UTC (rev 19329)
@@ -1071,7 +1071,7 @@
 		// Set this later
 		
 		if (newclass) {
-			BPy_RNA_PYTYPE(ptr->data) = newclass; /* Store for later use */
+			BPy_RNA_PYTYPE(ptr->data) = (void *)newclass; /* Store for later use */
 			
 			/* Not 100% needed but useful,
 			 * having an instance within a type looks wrong however this instance IS an rna type */
@@ -1198,8 +1198,8 @@
 			if (type) {
 				name = PyObject_GetAttrString(type, "__name__"); /* myClass.__name__ */
 				if (name) {
+					Py_DECREF(name);
 					PyDict_SetItem(dict, name, type);
-					Py_DECREF(name);
 				}
 				else {
 					printf("could not get type __name__\n");
@@ -1222,7 +1222,7 @@
  * This isnt incorrect since its a python object - but be careful */
 PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
 {
-	static char *kwlist[] = {"attribute", "name", "description", "min", "max", "soft_min", "soft_max", "default", NULL};
+	static char *kwlist[] = {"attr", "name", "description", "min", "max", "soft_min", "soft_max", "default", NULL};
 	char *id, *name="", *description="";
 	float min=FLT_MIN, max=FLT_MAX, soft_min=FLT_MIN, soft_max=FLT_MAX, def=0.0f;
 	
@@ -1249,7 +1249,7 @@
 
 PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
 {
-	static char *kwlist[] = {"attribute", "name", "description", "min", "max", "soft_min", "soft_max", "default", NULL};
+	static char *kwlist[] = {"attr", "name", "description", "min", "max", "soft_min", "soft_max", "default", NULL};
 	char *id, *name="", *description="";
 	int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, def=0;
 	
@@ -1276,7 +1276,7 @@
 
 PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
 {
-	static char *kwlist[] = {"attribute", "name", "description", "default", NULL};
+	static char *kwlist[] = {"attr", "name", "description", "default", NULL};
 	char *id, *name="", *description="";
 	int def=0;
 	

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c	2009-03-18 17:30:33 UTC (rev 19328)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c	2009-03-18 22:22:58 UTC (rev 19329)
@@ -418,7 +418,6 @@
 	{"registerKey", (PyCFunction)Method_registerKey, METH_VARARGS, ""}, // XXX could have this in another place too
 	
 	
-	
 	{"getRegonPtr", (PyCFunction)Method_getRegonPtr,	METH_NOARGS, ""}, // XXX Nasty, we really need to improve dealing with context!
 	{"getAreaPtr", (PyCFunction)Method_getAreaPtr,		METH_NOARGS, ""},
 	{"getScreenPtr", (PyCFunction)Method_getScreenPtr, METH_NOARGS, ""},

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_util.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list