summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorK. S. Ernest (iFire) Lee <ernest.lee@chibifire.com>2021-10-29 18:42:57 -0700
committerK. S. Ernest (iFire) Lee <ernest.lee@chibifire.com>2022-05-17 08:50:32 -0700
commitec8e91e3cd1486e2134f92c2f393ce56d153841b (patch)
tree9b2dcc62230cfc22faf164fcfe6e4c7b215e8e94
parent35004aea48011296b9461c3c4e14100b8d686191 (diff)
Fix editor crash in built-in help when script inheritance chain changes.
-rw-r--r--editor/editor_help_search.cpp25
-rw-r--r--editor/editor_help_search.h2
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<DocData::MethodDoc *> constructors;
Vector<DocData::MethodDoc *> methods;