[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21804] branches/blender2.5/blender/source /blender/python/intern/bpy_rna.c: less verbose subtyping Py/C API code, use PyObject_CallFunction which supports packing the function args into a string .

Campbell Barton ideasman42 at gmail.com
Wed Jul 22 21:50:21 CEST 2009


Revision: 21804
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21804
Author:   campbellbarton
Date:     2009-07-22 21:50:21 +0200 (Wed, 22 Jul 2009)

Log Message:
-----------
less verbose subtyping Py/C API code, use PyObject_CallFunction which supports packing the function args into a string.

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

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-07-22 18:06:59 UTC (rev 21803)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-07-22 19:50:21 UTC (rev 21804)
@@ -2300,31 +2300,23 @@
 	} else if ((newclass= RNA_struct_py_type_get(srna))) {
 		Py_INCREF(newclass);
 	} else {
-		StructRNA *base;
-		
-		/* for now, return the base RNA type rather then a real module */
-		
-		/* Assume RNA_struct_py_type_get(srna) was alredy checked */
-		
 		/* subclass equivelents
 		- class myClass(myBase):
 			some='value' # or ...
 		- myClass = type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
 		*/
-		const char *descr= RNA_struct_ui_description(srna);
 
-		PyObject *args = PyTuple_New(3);
-		PyObject *bases = PyTuple_New(1);
+		/* Assume RNA_struct_py_type_get(srna) was alredy checked */
+		StructRNA *base;
+
 		PyObject *py_base= NULL;
-		PyObject *dict = PyDict_New();
-		PyObject *item;
-	
+
+		const char *idname= RNA_struct_identifier(srna);
+		const char *descr= RNA_struct_ui_description(srna);
+
+		if(!descr) descr= "(no docs)";
 		
-		// arg 1
-		//PyTuple_SET_ITEM(args, 0, PyUnicode_FromString(tp_name));
-		PyTuple_SET_ITEM(args, 0, PyUnicode_FromString(RNA_struct_identifier(srna)));
-		
-		// arg 2
+		/* get the base type */
 		base= RNA_struct_base(srna);
 		if(base && base != srna) {
 			/*/printf("debug subtype %s %p\n", RNA_struct_identifier(srna), srna); */
@@ -2336,34 +2328,8 @@
 			Py_INCREF(py_base);
 		}
 		
-		PyTuple_SET_ITEM(bases, 0, py_base);
+		newclass = PyObject_CallFunction(	(PyObject*)&PyType_Type, "s(N){ssss}", idname, py_base, "__module__","bpy.types", "__doc__",descr);
 
-		PyTuple_SET_ITEM(args, 1, bases);
-		
-		// arg 3 - add an instance of the rna 
-		if(descr) {
-			item= PyUnicode_FromString(descr);
-			PyDict_SetItemString(dict, "__doc__", item);
-			Py_DECREF(item);
-		}
-		
-		/* this isnt needed however its confusing if we get python script names in blender types,
-		 * because the __module__ is used when printing the class */
-		item= PyUnicode_FromString("bpy.types"); /* just to know its an internal type */
-		PyDict_SetItemString(dict, "__module__", item);
-		Py_DECREF(item);
-		
-		
-		PyTuple_SET_ITEM(args, 2, dict); // fill with useful subclass things!
-		
-		if (PyErr_Occurred()) {
-			PyErr_Print();
-			PyErr_Clear();
-		}
-		
-		newclass = PyObject_CallObject((PyObject *)&PyType_Type, args);
-		Py_DECREF(args);
-
 		if (newclass) {
 			pyrna_subtype_set_rna(newclass, srna);
 			// PyObSpit("NewStructRNA Type: ", (PyObject *)newclass);





More information about the Bf-blender-cvs mailing list