Cleanup: delay creating datamap until it's actually needed

Differential Revision: https://developer.blender.org/D7328
This commit is contained in:
Brecht Van Lommel 2020-04-03 13:34:12 +02:00
parent 44e5f7a8cf
commit d2a07c7b78
1 changed files with 19 additions and 35 deletions

View File

@ -9499,7 +9499,7 @@ static BHead *read_libblock(FileData *fd,
}
/* Read libblock struct. */
BHead *first_bhead = bhead;
BHead *id_bhead = bhead;
ID *id = read_struct(fd, bhead, "lib block");
if (id == NULL) {
return blo_bhead_next(fd, bhead);
@ -9531,20 +9531,6 @@ static BHead *read_libblock(FileData *fd,
}
}
/* read libblock */
BHead *id_bhead = bhead;
if (id_bhead->code != ID_LINK_PLACEHOLDER) {
/* need a name for the mallocN, just for debugging and sane prints on leaks */
const char *allocname = dataname(idcode);
/* read all data into fd->datamap */
/* TODO: for the undo case instead of building oldnewmap here we could just quickly check the
* bheads... could save some more ticks. Probably not worth it though, bottleneck is full
* depsgraph rebuild and evaluate, not actual file reading. */
bhead = read_data_into_datamap(fd, id_bhead, allocname);
}
/* Restore existing datablocks for undo. */
const bool do_partial_undo = (fd->skip_flags & BLO_READ_SKIP_UNDO_OLD_MAIN) == 0;
@ -9553,8 +9539,8 @@ static BHead *read_libblock(FileData *fd,
bool do_id_swap = false;
if (fd->memfile != NULL) {
if (id_bhead->code != ID_LINK_PLACEHOLDER) {
const bool is_identical = read_libblock_is_identical(fd, first_bhead);
if (bhead->code != ID_LINK_PLACEHOLDER) {
const bool is_identical = read_libblock_is_identical(fd, id_bhead);
DEBUG_PRINTF("%s: ID %s is unchanged: %d\n", __func__, id->name, is_identical);
BLI_assert(fd->old_idmap != NULL || !do_partial_undo);
@ -9603,8 +9589,8 @@ static BHead *read_libblock(FileData *fd,
if (can_finalize_and_return) {
DEBUG_PRINTF("Re-using existing ID %s instead of newly read one\n", id_old->name);
oldnewmap_insert(fd->libmap, id_bhead->old, id_old, id_bhead->code);
oldnewmap_insert(fd->libmap, id_old, id_old, id_bhead->code);
oldnewmap_insert(fd->libmap, bhead->old, id_old, bhead->code);
oldnewmap_insert(fd->libmap, id_old, id_old, bhead->code);
if (r_id) {
*r_id = id_old;
@ -9639,9 +9625,8 @@ static BHead *read_libblock(FileData *fd,
}
MEM_freeN(id);
oldnewmap_clear(fd->datamap);
return bhead;
return blo_bhead_next(fd, bhead);
}
}
@ -9659,8 +9644,7 @@ static BHead *read_libblock(FileData *fd,
* those. Besides maybe custom properties, no other ID should have pointers to those
* anyway...
* And linked IDs are handled separately as well. */
do_id_swap = !ELEM(idcode, ID_WM, ID_SCR, ID_WS) &&
!(id_bhead->code == ID_LINK_PLACEHOLDER);
do_id_swap = !ELEM(idcode, ID_WM, ID_SCR, ID_WS) && !(bhead->code == ID_LINK_PLACEHOLDER);
}
}
@ -9676,8 +9660,8 @@ static BHead *read_libblock(FileData *fd,
/* for ID_LINK_PLACEHOLDER check */
ID *id_target = do_id_swap ? id_old : id;
oldnewmap_insert(fd->libmap, id_bhead->old, id_target, id_bhead->code);
oldnewmap_insert(fd->libmap, id_old, id_target, id_bhead->code);
oldnewmap_insert(fd->libmap, bhead->old, id_target, bhead->code);
oldnewmap_insert(fd->libmap, id_old, id_target, bhead->code);
BLI_addtail(lb, id);
@ -9689,8 +9673,8 @@ static BHead *read_libblock(FileData *fd,
* to be done still. */
int id_tag = tag | LIB_TAG_NEED_LINK | LIB_TAG_NEW;
if (id_bhead->code == ID_LINK_PLACEHOLDER) {
/* Tag to get replaced by the actual linked datablock. */
/* Read placeholder for linked datablock. */
if (bhead->code == ID_LINK_PLACEHOLDER) {
id_tag |= LIB_TAG_ID_LINK_PLACEHOLDER;
if (placeholder_set_indirect_extern) {
@ -9701,16 +9685,16 @@ static BHead *read_libblock(FileData *fd,
id_tag |= LIB_TAG_EXTERN;
}
}
direct_link_id(fd, main, id_tag, id, id_old);
return blo_bhead_next(fd, bhead);
}
/* Read datablock contents. */
/* Read datablock contents.
* Use convenient malloc name for debugging and better memory link prints. */
const char *allocname = dataname(idcode);
bhead = read_data_into_datamap(fd, bhead, allocname);
const bool success = direct_link_id(fd, main, id_tag, id, id_old);
/* For placeholders we are done here. */
if (id_bhead->code == ID_LINK_PLACEHOLDER) {
return blo_bhead_next(fd, id_bhead);
}
oldnewmap_clear(fd->datamap);
if (!success) {
@ -9755,7 +9739,7 @@ static BHead *read_libblock(FileData *fd,
id);
}
return (bhead);
return bhead;
}
/** \} */