[Bf-blender-cvs] [d17a0270344] master: Fix DNA struct member versioning logic

Campbell Barton noreply at git.blender.org
Fri Feb 15 08:19:39 CET 2019


Commit: d17a0270344101c4cd6e5026ea8239240868d24f
Author: Campbell Barton
Date:   Fri Feb 15 18:09:02 2019 +1100
Branches: master
https://developer.blender.org/rBd17a0270344101c4cd6e5026ea8239240868d24f

Fix DNA struct member versioning logic

Possible error changing names which are shared between structs.
While the problem doesn't occur at the moment, avoid future problems.

===================================================================

M	source/blender/makesdna/DNA_sdna_types.h
M	source/blender/makesdna/intern/dna_genfile.c

===================================================================

diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h
index 3ca2ce2fca4..36075d62002 100644
--- a/source/blender/makesdna/DNA_sdna_types.h
+++ b/source/blender/makesdna/DNA_sdna_types.h
@@ -34,7 +34,7 @@ typedef struct SDNA {
 	bool data_alloc;
 
 	/** Total number of struct members. */
-	int nr_names;
+	int nr_names, nr_names_alloc;
 	/** Struct member names. */
 	const char **names;
 
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index d168458fc9a..6fb9408c197 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -328,6 +328,7 @@ static bool init_structDNA(
 			if (do_endian_swap) {
 				BLI_endian_switch_int32(&sdna->nr_names);
 			}
+			sdna->nr_names_alloc = sdna->nr_names;
 
 			data++;
 			sdna->names = MEM_callocN(sizeof(void *) * sdna->nr_names, "sdnanames");
@@ -1400,7 +1401,7 @@ static bool DNA_sdna_patch_struct_member_nr(
 	const int elem_old_len = strlen(elem_old);
 	const int elem_new_len = strlen(elem_new);
 	BLI_assert(elem_new != NULL);
-	const short *sp = sdna->structs[struct_name_nr];
+	short *sp = sdna->structs[struct_name_nr];
 	for (int elem_index = sp[1]; elem_index > 0; elem_index--, sp += 2) {
 		const char *elem_old_full = sdna->names[sp[1]];
 		/* Start & end offsets in 'elem_old_full'. */
@@ -1416,7 +1417,13 @@ static bool DNA_sdna_patch_struct_member_nr(
 			        elem_old_full, strlen(elem_old_full),
 			        elem_old_full_offset_start);
 
+			if (sdna->nr_names == sdna->nr_names_alloc) {
+				sdna->nr_names_alloc += 64;
+				sdna->names = MEM_recallocN(sdna->names, sizeof(*sdna->names) * sdna->nr_names_alloc);
+			}
+			sp[1] = sdna->nr_names++;
 			sdna->names[sp[1]] = elem_new_full;
+
 			return true;
 		}
 	}



More information about the Bf-blender-cvs mailing list