[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22510] branches/blender2.5/blender/source /blender/python: own mistake, __rna__ wasnt causing circular references.

Campbell Barton ideasman42 at gmail.com
Sun Aug 16 14:29:46 CEST 2009


Revision: 22510
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22510
Author:   campbellbarton
Date:     2009-08-16 14:29:46 +0200 (Sun, 16 Aug 2009)

Log Message:
-----------
own mistake, __rna__ wasnt causing circular references. python can handle this. changing broke python operators like the pyConsole.

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

Modified: branches/blender2.5/blender/source/blender/python/epy_doc_gen.py
===================================================================
--- branches/blender2.5/blender/source/blender/python/epy_doc_gen.py	2009-08-16 11:45:25 UTC (rev 22509)
+++ branches/blender2.5/blender/source/blender/python/epy_doc_gen.py	2009-08-16 12:29:46 UTC (rev 22510)
@@ -313,9 +313,9 @@
 	structs = []
 	for rna_type_name in dir(bpy.types):
 		rna_type = getattr(bpy.types, rna_type_name)
-		if hasattr(rna_type, '__get_rna'):
+		if hasattr(rna_type, '__rna__'):
 			#if not rna_type_name.startswith('__'):
-			rna_struct = rna_type.__get_rna()
+			rna_struct = rna_type.__rna__
 			identifier = rna_struct.identifier
 			structs.append( (base_id(rna_struct), identifier, rna_struct) )	
 			

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-08-16 11:45:25 UTC (rev 22509)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-08-16 12:29:46 UTC (rev 22510)
@@ -2261,7 +2261,7 @@
 
 static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
 {
-	//PointerRNA ptr;
+	PointerRNA ptr;
 	PyObject *item;
 	
 	Py_INCREF(newclass);
@@ -2276,16 +2276,17 @@
 	/* Not 100% needed but useful,
 	 * having an instance within a type looks wrong however this instance IS an rna type */
 
-	/* cant use the real pytype because it makes a usercount deadlock */
-	//RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
-	//item = pyrna_struct_CreatePyObject(&ptr);
+	/* python deals with the curcular ref */
+	RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
+	item = pyrna_struct_CreatePyObject(&ptr);
 
-	item = PyCObject_FromVoidPtr(srna, NULL);
+	//item = PyCObject_FromVoidPtr(srna, NULL);
 	PyDict_SetItemString(((PyTypeObject *)newclass)->tp_dict, "__rna__", item);
 	Py_DECREF(item);
 	/* done with rna instance */
 }
 
+/*
 static StructRNA *srna_from_self(PyObject *self);
 PyObject *BPy_GetStructRNA(PyObject *self)
 {
@@ -2303,6 +2304,7 @@
 		Py_RETURN_NONE;
 	}
 }
+*/
 
 static struct PyMethodDef pyrna_struct_subtype_methods[] = {
 	{"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS, ""},
@@ -2310,7 +2312,7 @@
 	{"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, ""},
 	{"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS|METH_KEYWORDS, ""},
 
-	{"__get_rna", (PyCFunction)BPy_GetStructRNA, METH_NOARGS, ""},
+//	{"__get_rna", (PyCFunction)BPy_GetStructRNA, METH_NOARGS, ""},
 	{NULL, NULL, 0, NULL}
 };
 
@@ -2612,21 +2614,30 @@
 
 static StructRNA *pyrna_struct_as_srna(PyObject *self)
 {
-	PyObject *py_srna= (PyObject*)PyObject_GetAttrString(self, "__rna__");
+	BPy_StructRNA *py_srna= (BPy_StructRNA*)PyObject_GetAttrString(self, "__rna__");
+	StructRNA *srna;
 
 	if(py_srna==NULL) {
 	 	PyErr_SetString(PyExc_SystemError, "internal error, self had no __rna__ attribute, should never happen.");
 		return NULL;
 	}
 
-	if(!PyCObject_Check(py_srna)) {
-	 	PyErr_SetString(PyExc_SystemError, "internal error, self had no __rna__ attribute, should never happen.");
+	if(!BPy_StructRNA_Check(py_srna)) {
+	 	PyErr_Format(PyExc_SystemError, "internal error, __rna__ was of type %.200s, instead of %.200s instance.", Py_TYPE(py_srna)->tp_name, pyrna_struct_Type.tp_name);
 	 	Py_DECREF(py_srna);
 		return NULL;
 	}
 
+	if(py_srna->ptr.type != &RNA_Struct) {
+	 	PyErr_SetString(PyExc_SystemError, "internal error, __rna__ was not a RNA_Struct type of rna struct.");
+	 	Py_DECREF(py_srna);
+		return NULL;
+	}
+
+	srna= py_srna->ptr.data;
 	Py_DECREF(py_srna);
-	return (StructRNA *)PyCObject_AsVoidPtr(py_srna);
+
+	return srna;
 }
 
 





More information about the Bf-blender-cvs mailing list