[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