[Bf-blender-cvs] [60ac61b13f8] datablock_idprops: Fix obvious mistake in logic of two functions recursively handling IDProps.
Bastien Montagne
noreply at git.blender.org
Mon Mar 27 15:20:04 CEST 2017
Commit: 60ac61b13f8bffcb95faaf0178ae7d3e91ab0977
Author: Bastien Montagne
Date: Mon Mar 27 15:17:29 2017 +0200
Branches: datablock_idprops
https://developer.blender.org/rB60ac61b13f8bffcb95faaf0178ae7d3e91ab0977
Fix obvious mistake in logic of two functions recursively handling IDProps.
They were expecting IDP_group as parameter, but then recursiveley
calling themselves with IDProps from groups and arrays, which can be of
any type...
===================================================================
M source/blender/blenkernel/intern/idprop.c
M source/blender/blenloader/intern/readfile.c
===================================================================
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index 4bd17f38ebd..ff999bcf494 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -383,7 +383,7 @@ static IDProperty *IDP_CopyID(const IDProperty *prop)
newp = idp_generic_copy(prop);
if (IDP_Id(prop)) {
- newp->data.pointer = IDP_Id(prop);
+ newp->data.pointer = (ID *)IDP_Id(prop);
IDP_id_register(newp);
}
return newp;
@@ -789,37 +789,40 @@ IDProperty *IDP_CopyProperty(const IDProperty *prop)
}
/* Updates ID pointers after an object has been copied */
+/* TODO Nuke this once its only user has been correctly converted to use generic ID management from BKE_library! */
void IDP_RelinkProperty(struct IDProperty *prop)
{
- IDProperty *loop;
- IDProperty *idp_loop;
- int i;
-
if (!prop)
return;
- BLI_assert(prop->type == IDP_GROUP);
-
- loop = prop->data.group.first;
- while (loop) {
- switch (loop->type) {
- case IDP_GROUP:
+ switch (prop->type) {
+ case IDP_GROUP:
+ {
+ for (IDProperty *loop = prop->data.group.first; loop; loop = loop->next) {
IDP_RelinkProperty(loop);
- break;
- case IDP_IDPARRAY:
- idp_loop = IDP_Array(loop);
- for (i = 0; i < loop->len; i++)
- IDP_RelinkProperty(&idp_loop[i]);
- break;
- case IDP_ID:
- if (IDP_Id(loop) && IDP_Id(loop)->newid) {
- IDP_id_unregister(loop);
- loop->data.pointer = (void*)(IDP_Id(loop)->newid);
- IDP_id_register(loop);
- }
- break;
+ }
+ break;
+ }
+ case IDP_IDPARRAY:
+ {
+ IDProperty *idp_array = IDP_Array(prop);
+ for (int i = 0; i < prop->len; i++) {
+ IDP_RelinkProperty(&idp_array[i]);
+ }
+ break;
}
- loop = loop->next;
+ case IDP_ID:
+ {
+ ID *id = IDP_Id(prop);
+ if (id && id->newid) {
+ IDP_id_unregister(prop);
+ prop->data.pointer = id->newid;
+ IDP_id_register(prop);
+ }
+ break;
+ }
+ default:
+ break; /* Nothing to do for other IDProp types. */
}
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index cc1b263208b..06b1beec0bb 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2135,35 +2135,38 @@ static void _IDP_DirectLinkGroup_OrFree(IDProperty **prop, int switch_endian, Fi
static void IDP_LibLinkProperty(IDProperty *prop, FileData *fd)
{
- IDProperty *loop;
- IDProperty *idp_loop;
- void *newaddr = NULL;
- int i;
-
- if (!prop) return;
- BLI_assert(prop->type == IDP_GROUP);
+ if (!prop)
+ return;
- for (loop = prop->data.group.first; loop; loop = loop->next) {
- switch (loop->type) {
- case IDP_ID: /* PointerProperty */
- newaddr = newlibadr(fd, NULL, IDP_Id(loop));
- if (IDP_Id(loop) && !newaddr) {
- if (G.debug)
- printf("Error while loading \"%s\". Data not found in file!\n", loop->name);
- }
- loop->data.pointer = newaddr;
- IDP_id_register(loop);
- break;
- case IDP_IDPARRAY: /* CollectionProperty */
- idp_loop = IDP_Array(loop);
- for (i = 0; i < loop->len; i++) {
- IDP_LibLinkProperty(&(idp_loop[i]), fd);
- }
- break;
- case IDP_GROUP: /* PointerProperty */
+ switch (prop->type) {
+ case IDP_ID: /* PointerProperty */
+ {
+ void *newaddr = newlibadr(fd, NULL, IDP_Id(prop));
+ if (IDP_Id(prop) && !newaddr) {
+ if (G.debug)
+ printf("Error while loading \"%s\". Data not found in file!\n", prop->name);
+ }
+ prop->data.pointer = newaddr;
+ IDP_id_register(prop);
+ break;
+ }
+ case IDP_IDPARRAY: /* CollectionProperty */
+ {
+ IDProperty *idp_array = IDP_Array(prop);
+ for (int i = 0; i < prop->len; i++) {
+ IDP_LibLinkProperty(&(idp_array[i]), fd);
+ }
+ break;
+ }
+ case IDP_GROUP: /* PointerProperty */
+ {
+ for (IDProperty *loop = prop->data.group.first; loop; loop = loop->next) {
IDP_LibLinkProperty(loop, fd);
- break;
+ }
+ break;
}
+ default:
+ break; /* Nothing to do for other IDProps. */
}
}
More information about the Bf-blender-cvs
mailing list