From ec8e91e3cd1486e2134f92c2f393ce56d153841b Mon Sep 17 00:00:00 2001 From: "K. S. Ernest (iFire) Lee" Date: Fri, 29 Oct 2021 18:42:57 -0700 Subject: Fix editor crash in built-in help when script inheritance chain changes. --- editor/editor_help_search.cpp | 25 +++++++++++++++++++++---- editor/editor_help_search.h | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index d6ed2297c7..b85147fddf 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -323,10 +323,11 @@ bool EditorHelpSearch::Runner::_phase_match_classes_init() { bool EditorHelpSearch::Runner::_phase_match_classes() { DocData::ClassDoc &class_doc = iterator_doc->value; + if (class_doc.name.is_empty()) { + return false; + } if (!_is_class_disabled_by_feature_profile(class_doc.name)) { - matches[class_doc.name] = ClassMatch(); - ClassMatch &match = matches[class_doc.name]; - + ClassMatch match; match.doc = &class_doc; // Match class name. @@ -400,6 +401,7 @@ bool EditorHelpSearch::Runner::_phase_match_classes() { } } } + matches[class_doc.name] = match; } matches[class_doc.name] = match; } @@ -419,6 +421,9 @@ bool EditorHelpSearch::Runner::_phase_class_items_init() { } bool EditorHelpSearch::Runner::_phase_class_items() { + if (!iterator_match) { + return false; + } ClassMatch &match = iterator_match->value; if (search_flags & SEARCH_SHOW_HIERARCHY) { @@ -444,6 +449,13 @@ bool EditorHelpSearch::Runner::_phase_member_items_init() { bool EditorHelpSearch::Runner::_phase_member_items() { ClassMatch &match = iterator_match->value; + if (!match.doc) { + return false; + } + if (match.doc->name.is_empty()) { + return false; + } + TreeItem *parent = (search_flags & SEARCH_SHOW_HIERARCHY) ? class_items[match.doc->name] : root_item; bool constructor_created = false; for (int i = 0; i < match.methods.size(); i++) { @@ -511,6 +523,9 @@ void EditorHelpSearch::Runner::_match_item(TreeItem *p_item, const String &p_tex } TreeItem *EditorHelpSearch::Runner::_create_class_hierarchy(const ClassMatch &p_match) { + if (p_match.doc->name.is_empty()) { + return nullptr; + } if (class_items.has(p_match.doc->name)) { return class_items[p_match.doc->name]; } @@ -522,7 +537,9 @@ TreeItem *EditorHelpSearch::Runner::_create_class_hierarchy(const ClassMatch &p_ parent = class_items[p_match.doc->inherits]; } else { ClassMatch &base_match = matches[p_match.doc->inherits]; - parent = _create_class_hierarchy(base_match); + if (base_match.doc) { + parent = _create_class_hierarchy(base_match); + } } } diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h index 7b7235145a..3f17c992ac 100644 --- a/editor/editor_help_search.h +++ b/editor/editor_help_search.h @@ -99,7 +99,7 @@ class EditorHelpSearch::Runner : public RefCounted { int phase = 0; struct ClassMatch { - DocData::ClassDoc *doc; + DocData::ClassDoc *doc = nullptr; bool name = false; Vector constructors; Vector methods; -- cgit v1.2.3