From f5250d6bcf6ddc68f120ec8b2a58742a6f145934 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 4 Jan 2021 16:13:03 +0100 Subject: [PATCH] Fixed rvalues not evaluating correctly in nested structs --- include/lang/evaluator.hpp | 2 +- source/lang/evaluator.cpp | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/include/lang/evaluator.hpp b/include/lang/evaluator.hpp index cd513ac0f..80a1a7e2b 100644 --- a/include/lang/evaluator.hpp +++ b/include/lang/evaluator.hpp @@ -27,7 +27,7 @@ namespace hex::lang { std::endian m_defaultDataEndian; u64 m_currOffset = 0; std::optional m_currEndian; - std::vector *m_currMembers = nullptr; + std::vector*> m_currMembers; std::pair m_error; diff --git a/source/lang/evaluator.cpp b/source/lang/evaluator.cpp index d9cda1fe1..c6831bc70 100644 --- a/source/lang/evaluator.cpp +++ b/source/lang/evaluator.cpp @@ -16,7 +16,7 @@ namespace hex::lang { ASTNodeIntegerLiteral* Evaluator::evaluateRValue(ASTNodeRValue *node) { - const std::vector* currMembers = this->m_currMembers; + const std::vector* currMembers = this->m_currMembers.back(); PatternData *currPattern = nullptr; for (const auto &identifier : node->getPath()) { @@ -152,11 +152,8 @@ namespace hex::lang { PatternData* Evaluator::evaluateStruct(ASTNodeStruct *node) { std::vector memberPatterns; - ScopeExit currMemberReset([this] { this->m_currMembers = nullptr; }); - if (this->m_currMembers == nullptr) - this->m_currMembers = &memberPatterns; - else - currMemberReset.release(); + this->m_currMembers.push_back(&memberPatterns); + SCOPE_EXIT( this->m_currMembers.pop_back(); ); auto startOffset = this->m_currOffset; for (auto &member : node->getMembers()) { @@ -178,11 +175,8 @@ namespace hex::lang { PatternData* Evaluator::evaluateUnion(ASTNodeUnion *node) { std::vector memberPatterns; - ScopeExit currMemberReset([this] { this->m_currMembers = nullptr; }); - if (this->m_currMembers == nullptr) - this->m_currMembers = &memberPatterns; - else - currMemberReset.release(); + this->m_currMembers.push_back(&memberPatterns); + SCOPE_EXIT( this->m_currMembers.pop_back(); ); auto startOffset = this->m_currOffset; for (auto &member : node->getMembers()) {