1
0
mirror of synced 2025-02-17 18:59:21 +01:00

pattern: Fix scopes not always getting popped again correctly (#440)

Co-authored-by: Dmitry Polshakov <dmitry.polshakov@dsr-corporation.com>
This commit is contained in:
Polshakov Dmitry 2022-02-14 22:44:43 +03:00 committed by GitHub
parent 8be39488ec
commit 038b7961db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 8 deletions

View File

@ -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) {

View File

@ -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<ASTNodeTypeDecl *>(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());