Browse Source

Fix editor crash in built-in help when script inheritance chain changes.

K. S. Ernest (iFire) Lee 4 years ago
parent
commit
ec8e91e3cd
2 changed files with 22 additions and 5 deletions
  1. 21 4
      editor/editor_help_search.cpp
  2. 1 1
      editor/editor_help_search.h

+ 21 - 4
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);
+			}
 		}
 	}
 

+ 1 - 1
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;