Browse Source

Fix UndoRedo crash when clearing history

(cherry picked from commit c3baf83e2816a1438604b12ac626378f09f6cc18)
Haoyu Qiu 4 years ago
parent
commit
329df4e404
1 changed files with 14 additions and 6 deletions
  1. 14 6
      core/undo_redo.cpp

+ 14 - 6
core/undo_redo.cpp

@@ -41,9 +41,13 @@ void UndoRedo::_discard_redo() {
 	for (int i = current_action + 1; i < actions.size(); i++) {
 		for (List<Operation>::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);
+					}
 				}
 			}
 		}
@@ -221,9 +225,13 @@ void UndoRedo::_pop_history_tail() {
 
 	for (List<Operation>::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);
+				}
 			}
 		}
 	}