[Bf-blender-cvs] [2011156] master: Fix for crash linking node groups through bpy.data.library
Campbell Barton
noreply at git.blender.org
Thu Jan 30 14:56:58 CET 2014
Commit: 2011156eec720a01088bc0bd02bd4021e39d7c65
Author: Campbell Barton
Date: Fri Jan 31 00:53:02 2014 +1100
https://developer.blender.org/rB2011156eec720a01088bc0bd02bd4021e39d7c65
Fix for crash linking node groups through bpy.data.library
Defer creating the Python objects until after appending is finished
because NodeTree's types are not initialized until then.
===================================================================
M source/blender/python/intern/bpy_library.c
===================================================================
diff --git a/source/blender/python/intern/bpy_library.c b/source/blender/python/intern/bpy_library.c
index f4c21b1..7e84070 100644
--- a/source/blender/python/intern/bpy_library.c
+++ b/source/blender/python/intern/bpy_library.c
@@ -353,10 +353,9 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
ID *id = BLO_library_append_named_part(mainl, &(self->blo_handle), item_str, idcode);
if (id) {
#ifdef USE_RNA_DATABLOCKS
- PointerRNA id_ptr;
- RNA_id_pointer_create(id, &id_ptr);
+ /* swap name for pointer to the id */
Py_DECREF(item);
- item = pyrna_struct_CreatePyObject(&id_ptr);
+ item = PyCapsule_New((void *)id, NULL, NULL);
#endif
}
else {
@@ -417,6 +416,38 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
BKE_main_id_flag_all(bmain, LIB_PRE_EXISTING, false);
+ /* finally swap the capsules for real bpy objects
+ * important since BLO_library_append_end initializes NodeTree types used by srna->refine */
+ {
+ int idcode_step = 0, idcode;
+ while ((idcode = BKE_idcode_iter_step(&idcode_step))) {
+ if (BKE_idcode_is_linkable(idcode)) {
+ const char *name_plural = BKE_idcode_to_name_plural(idcode);
+ PyObject *ls = PyDict_GetItemString(self->dict, name_plural);
+ if (ls && PyList_Check(ls)) {
+ Py_ssize_t size = PyList_GET_SIZE(ls);
+ Py_ssize_t i;
+ PyObject *item;
+
+ for (i = 0; i < size; i++) {
+ item = PyList_GET_ITEM(ls, i);
+ if (PyCapsule_CheckExact(item)) {
+ PointerRNA id_ptr;
+ ID *id;
+
+ id = PyCapsule_GetPointer(item, NULL);
+ Py_DECREF(item);
+
+ RNA_id_pointer_create(id, &id_ptr);
+ item = pyrna_struct_CreatePyObject(&id_ptr);
+ PyList_SET_ITEM(ls, i, item);
+ }
+ }
+ }
+ }
+ }
+ }
+
Py_RETURN_NONE;
}
}
More information about the Bf-blender-cvs
mailing list