diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-07-06 15:23:50 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-07-06 16:07:37 +0300 |
commit | a0793765ef229b0d93bb9216b57faeb5940c5986 (patch) | |
tree | 986febb1a84980d9ae2bda092901859dd5385fe4 /source/blender/makesdna/intern | |
parent | 94e84f5be41de0f5b222f091e97f9fd0ad959460 (diff) |
writefile: avoid adding SDNA to every undo step
Since SDNA was allocated for each undo step,
the new address meant it was considered different and included again.
Add an option not to duplicate the DNA string when calling DNA_sdna_from_data,
as well as avoiding a redundant copy, it writes the same address each time.
Diffstat (limited to 'source/blender/makesdna/intern')
-rw-r--r-- | source/blender/makesdna/intern/dna_genfile.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c index 99ab29fbdcc..9135d7bab7d 100644 --- a/source/blender/makesdna/intern/dna_genfile.c +++ b/source/blender/makesdna/intern/dna_genfile.c @@ -196,7 +196,10 @@ int DNA_elem_array_size(const char *str) void DNA_sdna_free(SDNA *sdna) { - MEM_freeN(sdna->data); + if (sdna->data_alloc) { + MEM_freeN((void *)sdna->data); + } + MEM_freeN((void *)sdna->names); MEM_freeN(sdna->types); MEM_freeN(sdna->structs); @@ -549,15 +552,24 @@ static void init_structDNA(SDNA *sdna, bool do_endian_swap) /** * Constructs and returns a decoded SDNA structure from the given encoded SDNA data block. */ -SDNA *DNA_sdna_from_data(const void *data, const int datalen, bool do_endian_swap) +SDNA *DNA_sdna_from_data( + const void *data, const int datalen, + bool do_endian_swap, bool data_alloc) { SDNA *sdna = MEM_mallocN(sizeof(*sdna), "sdna"); sdna->lastfind = 0; sdna->datalen = datalen; - sdna->data = MEM_mallocN(datalen, "sdna_data"); - memcpy(sdna->data, data, datalen); + if (data_alloc) { + char *data_copy = MEM_mallocN(datalen, "sdna_data"); + memcpy(data_copy, data, datalen); + sdna->data = data_copy; + } + else { + sdna->data = data; + } + sdna->data_alloc = data_alloc; init_structDNA(sdna, do_endian_swap); |