From ee8b3bef2d2376aacc4e30003322a6448cd288cf Mon Sep 17 00:00:00 2001 From: John Wigg Date: Mon, 13 Apr 2020 14:30:56 +0200 Subject: [PATCH] Limit undo stack size The stack size of the undo history of a TextEdit was not limited leading to potential memory leaks when doing lots of operations on a TextEdit. This commit adds the option gui/common/text_edit_undo_stack_max_size to the project settings. The first element of the undo stack is popped if the stack's size exceeds this value ensuring limited memory usage. The default stack size setting is 1024. Fixes #37838. (cherry picked from commit 4a82390aafdf464a2776b1df3a75b47783d42b04) --- scene/gui/text_edit.cpp | 7 +++++++ scene/gui/text_edit.h | 1 + 2 files changed, 8 insertions(+) diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 5bfd422b23f..50597c98046 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -6212,6 +6212,10 @@ void TextEdit::_push_current_op() { current_op.type = TextOperation::TYPE_NONE; current_op.text = ""; current_op.chain_forward = false; + + if (undo_stack.size() > undo_stack_max_size) { + undo_stack.pop_front(); + } } void TextEdit::set_indent_using_spaces(const bool p_use_spaces) { @@ -7189,6 +7193,8 @@ void TextEdit::_bind_methods() { GLOBAL_DEF("gui/timers/text_edit_idle_detect_sec", 3); ProjectSettings::get_singleton()->set_custom_property_info("gui/timers/text_edit_idle_detect_sec", PropertyInfo(Variant::REAL, "gui/timers/text_edit_idle_detect_sec", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater")); // No negative numbers. + GLOBAL_DEF("gui/common/text_edit_undo_stack_max_size", 1024); + ProjectSettings::get_singleton()->set_custom_property_info("gui/common/text_edit_undo_stack_max_size", PropertyInfo(Variant::INT, "gui/common/text_edit_undo_stack_max_size", PROPERTY_HINT_RANGE, "0,10000,1,or_greater")); // No negative numbers. } TextEdit::TextEdit() { @@ -7268,6 +7274,7 @@ TextEdit::TextEdit() { current_op.type = TextOperation::TYPE_NONE; undo_enabled = true; + undo_stack_max_size = GLOBAL_GET("gui/common/text_edit_undo_stack_max_size"); undo_stack_pos = NULL; setting_text = false; last_dblclk = 0; diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index b4e7dcfebb1..d7bbf4d1b0a 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -306,6 +306,7 @@ private: List undo_stack; List::Element *undo_stack_pos; + int undo_stack_max_size; void _clear_redo(); void _do_text_op(const TextOperation &p_op, bool p_reverse);