From c3baf83e2816a1438604b12ac626378f09f6cc18 Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Sat, 24 Jul 2021 00:53:58 +0800 Subject: [PATCH] Fix UndoRedo crash when clearing history --- core/object/undo_redo.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/core/object/undo_redo.cpp b/core/object/undo_redo.cpp index 0532b2ae40..6808d7602d 100644 --- a/core/object/undo_redo.cpp +++ b/core/object/undo_redo.cpp @@ -41,9 +41,13 @@ void UndoRedo::_discard_redo() { for (int i = current_action + 1; i < actions.size(); i++) { for (List::Element *E = actions.write[i].do_ops.front(); E; E = E->next()) { if (E->get().type == Operation::TYPE_REFERENCE) { - Object *obj = ObjectDB::get_instance(E->get().object); - if (obj) { - memdelete(obj); + if (E->get().ref.is_valid()) { + E->get().ref.unref(); + } else { + Object *obj = ObjectDB::get_instance(E->get().object); + if (obj) { + memdelete(obj); + } } } } @@ -242,9 +246,13 @@ void UndoRedo::_pop_history_tail() { for (List::Element *E = actions.write[0].undo_ops.front(); E; E = E->next()) { if (E->get().type == Operation::TYPE_REFERENCE) { - Object *obj = ObjectDB::get_instance(E->get().object); - if (obj) { - memdelete(obj); + if (E->get().ref.is_valid()) { + E->get().ref.unref(); + } else { + Object *obj = ObjectDB::get_instance(E->get().object); + if (obj) { + memdelete(obj); + } } } }