[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13822] trunk/blender/source/blender: = ID Property Bugfix=
Joseph Eagar
joeedh at gmail.com
Sat Feb 23 03:12:53 CET 2008
Revision: 13822
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13822
Author: joeedh
Date: 2008-02-23 03:12:50 +0100 (Sat, 23 Feb 2008)
Log Message:
-----------
=ID Property Bugfix=
There was an extraneous line causing ID property groups
to have the wrong length, causing crashes in code that
relied on it.
This commit both fixes that and adds a version check to
fix group lengths for older .blends. The subversion
was incremented to 15 for this change.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/idprop.c
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/python/api2_2x/IDProp.c
Modified: trunk/blender/source/blender/blenkernel/intern/idprop.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/idprop.c 2008-02-22 22:23:58 UTC (rev 13821)
+++ trunk/blender/source/blender/blenkernel/intern/idprop.c 2008-02-23 02:12:50 UTC (rev 13822)
@@ -228,10 +228,11 @@
if (BSTR_EQ(loop->name, prop->name)) {
if (loop->next) BLI_insertlinkbefore(&group->data.group, loop->next, prop);
else BLI_addtail(&group->data.group, prop);
+
BLI_remlink(&group->data.group, loop);
IDP_FreeProperty(loop);
MEM_freeN(loop);
- group->len++;
+
return;
}
}
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2008-02-22 22:23:58 UTC (rev 13821)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2008-02-23 02:12:50 UTC (rev 13822)
@@ -4665,7 +4665,32 @@
}
}
+void idproperties_fix_groups_lengths_recurse(IDProperty *prop)
+{
+ IDProperty *loop;
+ int i;
+
+ for (loop=prop->data.group.first, i=0; loop; loop=loop->next, i++) {
+ if (loop->type == IDP_GROUP) idproperties_fix_groups_lengths_recurse(loop);
+ }
+
+ if (prop->len != i) {
+ printf("Found and fixed bad id property group length.\n");
+ prop->len = i;
+ }
+}
+void idproperties_fix_group_lengths(ListBase idlist)
+{
+ ID *id;
+
+ for (id=idlist.first; id; id=id->next) {
+ if (id->properties) {
+ idproperties_fix_groups_lengths_recurse(id->properties);
+ }
+ }
+}
+
static void do_versions(FileData *fd, Library *lib, Main *main)
{
/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -7449,6 +7474,37 @@
sce= sce->id.next;
}
}
+
+ /*fix broken group lengths in id properties*/
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 15)) {
+ idproperties_fix_group_lengths(main->scene);
+ idproperties_fix_group_lengths(main->library);
+ idproperties_fix_group_lengths(main->object);
+ idproperties_fix_group_lengths(main->mesh);
+ idproperties_fix_group_lengths(main->curve);
+ idproperties_fix_group_lengths(main->mball);
+ idproperties_fix_group_lengths(main->mat);
+ idproperties_fix_group_lengths(main->tex);
+ idproperties_fix_group_lengths(main->image);
+ idproperties_fix_group_lengths(main->wave);
+ idproperties_fix_group_lengths(main->latt);
+ idproperties_fix_group_lengths(main->lamp);
+ idproperties_fix_group_lengths(main->camera);
+ idproperties_fix_group_lengths(main->ipo);
+ idproperties_fix_group_lengths(main->key);
+ idproperties_fix_group_lengths(main->world);
+ idproperties_fix_group_lengths(main->screen);
+ idproperties_fix_group_lengths(main->script);
+ idproperties_fix_group_lengths(main->vfont);
+ idproperties_fix_group_lengths(main->text);
+ idproperties_fix_group_lengths(main->sound);
+ idproperties_fix_group_lengths(main->group);
+ idproperties_fix_group_lengths(main->armature);
+ idproperties_fix_group_lengths(main->action);
+ idproperties_fix_group_lengths(main->nodetree);
+ idproperties_fix_group_lengths(main->brush);
+ idproperties_fix_group_lengths(main->particle);
+ }
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
Modified: trunk/blender/source/blender/python/api2_2x/IDProp.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/IDProp.c 2008-02-22 22:23:58 UTC (rev 13821)
+++ trunk/blender/source/blender/python/api2_2x/IDProp.c 2008-02-23 02:12:50 UTC (rev 13822)
@@ -433,7 +433,7 @@
{
PyObject *seq = PyList_New(self->prop->len);
IDProperty *loop;
- int i;
+ int i, j;
if (!seq)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
@@ -442,6 +442,25 @@
for (i=0, loop=self->prop->data.group.first; loop; loop=loop->next, i++)
PyList_SetItem(seq, i, PyString_FromString(loop->name));
+ if (i != self->prop->len) {
+ printf("ID Property Error found and corrected in BPy_IDGroup_GetKeys!\n");
+
+ /*fill rest of list with valid references to None*/
+ for (j=i; j<self->prop->len; j++) {
+ Py_INCREF(Py_None);
+ PyList_SetItem(seq, j, Py_None);
+ }
+
+ /*set correct group length*/
+ self->prop->len = i;
+
+ /*free the old list*/
+ Py_DECREF(seq);
+
+ /*call self again*/
+ return BPy_IDGroup_GetKeys(self);
+ }
+
return seq;
}
@@ -449,7 +468,7 @@
{
PyObject *seq = PyList_New(self->prop->len);
IDProperty *loop;
- int i;
+ int i, j;
if (!seq)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
@@ -458,7 +477,26 @@
for (i=0, loop=self->prop->data.group.first; loop; loop=loop->next, i++) {
PyList_SetItem(seq, i, BPy_IDGroup_WrapData(self->id, loop));
}
-
+
+ if (i != self->prop->len) {
+ printf("ID Property Error found and corrected in BPy_IDGroup_GetValues!\n");
+
+ /*fill rest of list with valid references to None*/
+ for (j=i; j<self->prop->len; j++) {
+ Py_INCREF(Py_None);
+ PyList_SetItem(seq, j, Py_None);
+ }
+
+ /*set correct group length*/
+ self->prop->len = i;
+
+ /*free the old list*/
+ Py_DECREF(seq);
+
+ /*call self again*/
+ return BPy_IDGroup_GetValues(self);
+ }
+
return seq;
}
More information about the Bf-blender-cvs
mailing list