Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2008-02-23 05:12:50 +0300
committerJoseph Eagar <joeedh@gmail.com>2008-02-23 05:12:50 +0300
commitf312611a924304bf7048abbb9f5a4dc7895a9c7f (patch)
tree8265fbc31fd74c146c3f249fcdc6ba2f01e07752
parent0e233b3213a21449399d91b9ee841c235fbba4d7 (diff)
=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.
-rw-r--r--source/blender/blenkernel/intern/idprop.c3
-rw-r--r--source/blender/blenloader/intern/readfile.c56
-rw-r--r--source/blender/python/api2_2x/IDProp.c44
3 files changed, 99 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index 85144a535d3..8ac0ff77832 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -228,10 +228,11 @@ void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
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;
}
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index f9a5c419adc..ae7e3b273b3 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4665,6 +4665,31 @@ static void ntree_version_245(bNodeTree *ntree)
}
}
+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)
{
@@ -7449,6 +7474,37 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
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! */
diff --git a/source/blender/python/api2_2x/IDProp.c b/source/blender/python/api2_2x/IDProp.c
index cf5cf42de5d..3358b06d30b 100644
--- a/source/blender/python/api2_2x/IDProp.c
+++ b/source/blender/python/api2_2x/IDProp.c
@@ -433,7 +433,7 @@ PyObject *BPy_IDGroup_GetKeys(BPy_IDProperty *self)
{
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 @@ PyObject *BPy_IDGroup_GetKeys(BPy_IDProperty *self)
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 *BPy_IDGroup_GetValues(BPy_IDProperty *self)
{
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 @@ PyObject *BPy_IDGroup_GetValues(BPy_IDProperty *self)
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;
}