diff --git a/lib/libimhex/include/hex/pattern_language/ast_node.hpp b/lib/libimhex/include/hex/pattern_language/ast_node.hpp index 71d8c06b0..1a54106d9 100644 --- a/lib/libimhex/include/hex/pattern_language/ast_node.hpp +++ b/lib/libimhex/include/hex/pattern_language/ast_node.hpp @@ -669,7 +669,9 @@ namespace hex::pl { evaluator->pushScope(nullptr, variables); evaluator->getScope(0).parameterPack = parameterPack; - ON_SCOPE_EXIT { evaluator->popScope(); }; + ON_SCOPE_EXIT { + evaluator->popScope(); + }; auto ctrlFlow = ControlFlowStatement::None; for (auto &statement : this->m_body) { @@ -1378,6 +1380,9 @@ namespace hex::pl { }; evaluator->pushScope(pattern, memberPatterns); + ON_SCOPE_EXIT { + evaluator->popScope(); + }; for (auto inheritance : this->m_inheritance) { auto inheritancePatterns = inheritance->createPatterns(evaluator).front(); @@ -1398,8 +1403,6 @@ namespace hex::pl { } } - evaluator->popScope(); - pattern->setMembers(memberPatterns); pattern->setSize(evaluator->dataOffset() - startOffset); @@ -1452,6 +1455,10 @@ namespace hex::pl { }; evaluator->pushScope(pattern, memberPatterns); + ON_SCOPE_EXIT { + evaluator->popScope(); + }; + for (auto member : this->m_members) { for (auto &memberPattern : member->createPatterns(evaluator)) { memberPattern->setOffset(startOffset); @@ -1459,7 +1466,6 @@ namespace hex::pl { size = std::max(memberPattern->getSize(), size); } } - evaluator->popScope(); evaluator->dataOffset() = startOffset + size; pattern->setMembers(memberPatterns); @@ -1578,6 +1584,10 @@ namespace hex::pl { std::reverse(entries.begin(), entries.end()); evaluator->pushScope(pattern, fields); + ON_SCOPE_EXIT { + evaluator->popScope(); + }; + for (auto [name, bitSizeNode] : entries) { auto literal = bitSizeNode->evaluate(evaluator); ON_SCOPE_EXIT { delete literal; }; @@ -1598,7 +1608,6 @@ namespace hex::pl { bitOffset += bitSize; } - evaluator->popScope(); pattern->setSize((bitOffset + 7) / 8); pattern->setFields(fields); @@ -2015,7 +2024,10 @@ namespace hex::pl { evaluator->pushScope(nullptr, variables); evaluator->getScope(0).parameterPack = parameterPack; - ON_SCOPE_EXIT { evaluator->popScope(); }; + ON_SCOPE_EXIT { + evaluator->popScope(); + }; + for (auto &statement : body) { auto result = statement->execute(evaluator); if (auto ctrlStatement = evaluator->getCurrentControlFlowStatement(); ctrlStatement != ControlFlowStatement::None) { diff --git a/lib/libimhex/source/pattern_language/evaluator.cpp b/lib/libimhex/source/pattern_language/evaluator.cpp index 4af32de21..4da578ddf 100644 --- a/lib/libimhex/source/pattern_language/evaluator.cpp +++ b/lib/libimhex/source/pattern_language/evaluator.cpp @@ -156,6 +156,9 @@ namespace hex::pl { try { this->setCurrentControlFlowStatement(ControlFlowStatement::None); pushScope(nullptr, patterns); + ON_SCOPE_EXIT { + popScope(); + }; for (auto node : ast) { if (dynamic_cast(node)) { @@ -195,8 +198,6 @@ namespace hex::pl { this->m_mainResult = mainFunction.func(this, {}); } - - popScope(); } catch (PatternLanguageError &error) { this->m_console.log(LogConsole::Level::Error, error.what());