From 04a5efc7a3c1b201123ff96571985f8b2ea84b89 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 17 Apr 2023 17:02:10 +0200 Subject: [PATCH] fix: Crash when evaluating patterns to quickly --- lib/external/pattern_language | 2 +- main/source/window/window.cpp | 2 +- .../content/views/view_pattern_data.hpp | 1 + .../content/views/view_pattern_data.cpp | 26 +++++++++---------- .../content/views/view_pattern_editor.cpp | 15 ++++++----- .../builtin/source/content/welcome_screen.cpp | 4 +-- 6 files changed, 27 insertions(+), 23 deletions(-) diff --git a/lib/external/pattern_language b/lib/external/pattern_language index ce644cf16..a84deb289 160000 --- a/lib/external/pattern_language +++ b/lib/external/pattern_language @@ -1 +1 @@ -Subproject commit ce644cf16223f4e335a49e8f3e3cc3d9d9afe4ae +Subproject commit a84deb2891c4bba0c694a85e05179dd791d0845f diff --git a/main/source/window/window.cpp b/main/source/window/window.cpp index 0f7f06229..9b90d3e11 100644 --- a/main/source/window/window.cpp +++ b/main/source/window/window.cpp @@ -585,7 +585,7 @@ namespace hex { log::debug("Closing popup '{}'", name); positionSet = sizeSet = false; - popups.pop_back(); + popups.erase(std::find(popups.begin(), popups.end(), currPopup)); } } } diff --git a/plugins/builtin/include/content/views/view_pattern_data.hpp b/plugins/builtin/include/content/views/view_pattern_data.hpp index c6c0a3947..7beadc1b2 100644 --- a/plugins/builtin/include/content/views/view_pattern_data.hpp +++ b/plugins/builtin/include/content/views/view_pattern_data.hpp @@ -20,6 +20,7 @@ namespace hex::plugin::builtin { private: ui::PatternDrawer m_patternDrawer; + bool m_shouldReset = false; }; } \ No newline at end of file diff --git a/plugins/builtin/source/content/views/view_pattern_data.cpp b/plugins/builtin/source/content/views/view_pattern_data.cpp index 8bc05c5c4..405c77b08 100644 --- a/plugins/builtin/source/content/views/view_pattern_data.cpp +++ b/plugins/builtin/source/content/views/view_pattern_data.cpp @@ -19,6 +19,10 @@ namespace hex::plugin::builtin { }); this->m_patternDrawer.setSelectionCallback([](Region region){ ImHexApi::HexEditor::setSelection(region); }); + + EventManager::subscribe([this](const auto&){ + this->m_shouldReset = true; + }); } ViewPatternData::~ViewPatternData() { @@ -29,23 +33,19 @@ namespace hex::plugin::builtin { void ViewPatternData::drawContent() { if (ImGui::Begin(View::toWindowName("hex.builtin.view.pattern_data.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { if (ImHexApi::Provider::isValid()) { - auto provider = ImHexApi::Provider::get(); - auto &runtime = ContentRegistry::PatternLanguage::getRuntime(); + if (!runtime.arePatternsValid()) { + this->m_patternDrawer.draw({}); + } else { + auto lock = ContentRegistry::PatternLanguage::getRuntimeLock(); - const auto &patterns = [&] -> const auto& { - if (provider->isReadable()) - return runtime.getAllPatterns(); - else { - static const std::vector> empty; - return empty; + if (this->m_shouldReset) { + this->m_patternDrawer.reset(); + this->m_shouldReset = false; } - }(); - if (runtime.isRunning()) - this->m_patternDrawer.reset(); - - this->m_patternDrawer.draw(patterns); + this->m_patternDrawer.draw(runtime.getAllPatterns()); + } } } ImGui::End(); diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index a46b08151..9211665ab 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -396,7 +396,7 @@ namespace hex::plugin::builtin { ImGui::Checkbox(label.c_str(), &value); variable.value = value; } else if (variable.type == pl::core::Token::ValueType::Character) { - std::array buffer; + std::array buffer = { }; ImGui::InputText(label.c_str(), buffer.data(), buffer.size()); variable.value = buffer[0]; } @@ -653,14 +653,13 @@ namespace hex::plugin::builtin { this->m_sectionWindowDrawer.clear(); EventManager::post(); - EventManager::post(code); - TaskManager::createTask("hex.builtin.view.pattern_editor.evaluating", TaskManager::NoProgress, [this, code, provider](auto &task) { + auto &runtime = ContentRegistry::PatternLanguage::getRuntime(); + ContentRegistry::PatternLanguage::configureRuntime(runtime, provider); + + TaskManager::createTask("hex.builtin.view.pattern_editor.evaluating", TaskManager::NoProgress, [this, code, &runtime](auto &task) { auto lock = ContentRegistry::PatternLanguage::getRuntimeLock(); - auto &runtime = ContentRegistry::PatternLanguage::getRuntime(); - ContentRegistry::PatternLanguage::configureRuntime(runtime, provider); - task.setInterruptCallback([&runtime] { runtime.abort(); }); std::map envVars; @@ -703,6 +702,10 @@ namespace hex::plugin::builtin { if (!this->m_lastEvaluationResult) { *this->m_lastEvaluationError = runtime.getError(); } + + TaskManager::doLater([code = std::move(code)] { + EventManager::post(code); + }); }); } diff --git a/plugins/builtin/source/content/welcome_screen.cpp b/plugins/builtin/source/content/welcome_screen.cpp index 2e14e02e9..5d54c7bdc 100644 --- a/plugins/builtin/source/content/welcome_screen.cpp +++ b/plugins/builtin/source/content/welcome_screen.cpp @@ -81,14 +81,14 @@ namespace hex::plugin::builtin { wolv::io::fs::remove(s_safetyBackupPath); - Popup::close(); + this->close(); } ImGui::SameLine(); ImGui::SetCursorPosX(width / 9 * 5); if (ImGui::Button("hex.builtin.popup.safety_backup.delete"_lang, ImVec2(width / 3, 0))) { wolv::io::fs::remove(s_safetyBackupPath); - Popup::close(); + this->close(); } } };