From 63fd61e24534d65bcb809dec4742a4e058f575f4 Mon Sep 17 00:00:00 2001 From: Aki Sakurai <75532970+AkiSakurai@users.noreply.github.com> Date: Mon, 5 Jan 2026 18:11:21 +0800 Subject: [PATCH] Fix crash in Pattern Language syntax highlighting for self-inheriting structs (#2546) ``` rust struct Rec : Rec { }; ``` Prevent infinite recursion in appendInheritances by erasing processed inheritance entries during traversal, and safely iterate over m_inheritances in appendInheritances to avoid modification-during-iteration issues. Co-authored-by: paxcut <53811119+paxcut@users.noreply.github.com> --- .../include/content/text_highlighting/pattern_language.hpp | 2 +- .../source/content/text_highlighting/pattern_language.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/builtin/include/content/text_highlighting/pattern_language.hpp b/plugins/builtin/include/content/text_highlighting/pattern_language.hpp index b764170f3..1fb947951 100644 --- a/plugins/builtin/include/content/text_highlighting/pattern_language.hpp +++ b/plugins/builtin/include/content/text_highlighting/pattern_language.hpp @@ -218,7 +218,7 @@ namespace hex::plugin::builtin { std::string getVariableTypeName(); /// Append the variable definitions of the parent to the child void appendInheritances(); - void recurseInheritances(std::string name); + void recurseInheritances(std::string name, size_t depth = 0); ///Loads a map of identifiers to their token id instances void loadInstances(); /// Replace auto with the actual type for template arguments and function parameters diff --git a/plugins/builtin/source/content/text_highlighting/pattern_language.cpp b/plugins/builtin/source/content/text_highlighting/pattern_language.cpp index c6b9ca0ca..6ef7fa936 100644 --- a/plugins/builtin/source/content/text_highlighting/pattern_language.cpp +++ b/plugins/builtin/source/content/text_highlighting/pattern_language.cpp @@ -1858,10 +1858,13 @@ namespace hex::plugin::builtin { } } - void TextHighlighter::recurseInheritances(std::string name) { + void TextHighlighter::recurseInheritances(std::string name, size_t depth) { + if (depth > m_inheritances.size()) + return; if (m_inheritances.contains(name)) { for (const auto &inheritance: m_inheritances[name]) { - recurseInheritances(inheritance); + recurseInheritances(inheritance, depth + 1); + auto definitions = m_UDTVariables[inheritance]; if (definitions.empty()) definitions = m_ImportedUDTVariables[inheritance];