[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11832] trunk/blender/source/blender/ python/api2_2x/Armature.c: getting the armature twice would cause a weakref error and crash after 2-4 runs ..

Campbell Barton cbarton at metavr.com
Sat Aug 25 21:05:18 CEST 2007


Revision: 11832
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11832
Author:   campbellbarton
Date:     2007-08-25 21:05:18 +0200 (Sat, 25 Aug 2007)

Log Message:
-----------
getting the armature twice would cause a weakref error and crash after 2-4 runs..

data = arm_ob.data
bones = arm_ob.data.bones.values()

Fixed by returning existing armatures if they exist in the weakref list. tested with FBX and BVH support.

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/Armature.c

Modified: trunk/blender/source/blender/python/api2_2x/Armature.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Armature.c	2007-08-25 18:00:33 UTC (rev 11831)
+++ trunk/blender/source/blender/python/api2_2x/Armature.c	2007-08-25 19:05:18 UTC (rev 11832)
@@ -1318,7 +1318,28 @@
 	PyObject *maindict = NULL, *weakref = NULL;
 	PyObject *armlist = NULL;  /* list of armature weak refs */
 	char *list_name = ARM_WEAKREF_LIST_NAME;
+	int i;
 
+	//put a weakreference in __main__
+	maindict= PyModule_GetDict(PyImport_AddModule(	"__main__"));
+
+	armlist = PyDict_GetItemString(maindict, list_name);
+	if(!armlist) {
+		printf("Oops - can't get the armature weakref list\n");
+		goto RuntimeError;
+	}
+
+	/* see if we alredy have it */
+	for (i=0; i< PyList_Size(armlist); i++) { 
+		py_armature = (BPy_Armature *)PyWeakref_GetObject(PyList_GET_ITEM(armlist, i));
+		if (BPy_Armature_Check(py_armature) && py_armature->armature == armature) {
+			Py_INCREF(py_armature);
+			/*printf("reusing armature\n");*/
+			return (PyObject *)py_armature;
+		}
+	}
+
+	
 	/*create armature type*/
 	py_armature = PyObject_NEW( BPy_Armature, &Armature_Type );
 	
@@ -1336,19 +1357,13 @@
 		printf("Oops - creating armature.bones\n");
 		goto RuntimeError;
 	}
-
-	//put a weakreference in __main__
-	maindict= PyModule_GetDict(PyImport_AddModule(	"__main__"));
-
-	armlist = PyDict_GetItemString(maindict, list_name);
-	if( armlist){
-		weakref = PyWeakref_NewProxy((PyObject*)py_armature, arm_weakref_callback_weakref_dealloc__pyfunc);
-		if (PyList_Append(armlist, weakref) == -1){
-			printf("Oops - list-append failed\n");
-			goto RuntimeError;
-		}
-		Py_DECREF(weakref);
+	
+	weakref = PyWeakref_NewProxy((PyObject*)py_armature, arm_weakref_callback_weakref_dealloc__pyfunc);
+	if (PyList_Append(armlist, weakref) == -1){
+		printf("Oops - list-append failed\n");
+		goto RuntimeError;
 	}
+	Py_DECREF(weakref);
 
 	return (PyObject *) py_armature;
 





More information about the Bf-blender-cvs mailing list