diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/lib_override.c | 16 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_convert.cc | 9 |
2 files changed, 17 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 608c3949858..6dd13952413 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -2349,13 +2349,15 @@ static int lib_override_sort_libraries_func(LibraryIDLinkCallbackData *cb_data) if (id != NULL && ID_IS_LINKED(id) && id->lib != id_owner->lib) { const int owner_library_indirect_level = ID_IS_LINKED(id_owner) ? id_owner->lib->temp_index : 0; - if (owner_library_indirect_level > 10000) { - CLOG_ERROR( - &LOG, - "Levels of indirect usages of libraries is way too high, skipping further building " - "loops (Involves at least '%s' and '%s')", - id_owner->lib->filepath, - id->lib->filepath); + if (owner_library_indirect_level > 200) { + CLOG_ERROR(&LOG, + "Levels of indirect usages of libraries is way too high, there are most likely " + "dependency loops, skipping further building loops (involves at least '%s' from " + "'%s' and '%s' from '%s')", + id_owner->name, + id_owner->lib->filepath, + id->name, + id->lib->filepath); return IDWALK_RET_NOP; } diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc index 07c9bccacc3..97eafb75102 100644 --- a/source/blender/blenkernel/intern/mesh_convert.cc +++ b/source/blender/blenkernel/intern/mesh_convert.cc @@ -890,8 +890,15 @@ static void object_for_curve_to_mesh_free(Object *temp_object) curve.editnurb = nullptr; } - BKE_id_free(nullptr, temp_object->data); + /* Only free the final object data if it is *not* stored in the #data_eval field. This is still + * necessary because #temp_object's data could be replaced by a #Curve data-block that isn't also + * assigned to #data_eval. */ + const bool object_data_stored_in_data_eval = final_object_data == temp_object->runtime.data_eval; + BKE_id_free(nullptr, temp_object); + if (!object_data_stored_in_data_eval) { + BKE_id_free(nullptr, final_object_data); + } } /** |