Disallow non-functional instructions in parseExpression early

This commit is contained in:
Alex Beregszaszi 2018-01-09 17:30:14 +00:00 committed by chriseth
parent 42f8875770
commit 8b20a7cd53
2 changed files with 7 additions and 4 deletions

View File

@ -265,10 +265,13 @@ assembly::Expression Parser::parseExpression()
instructionNames().at(instr.instruction) + instructionNames().at(instr.instruction) +
"\" not allowed in this context." "\" not allowed in this context."
); );
if (m_flavour != AsmFlavour::Loose && currentToken() != Token::LParen)
fatalParserError(
"Non-functional instructions are not allowed in this context."
);
// Enforce functional notation for instructions requiring multiple arguments. // Enforce functional notation for instructions requiring multiple arguments.
int args = instructionInfo(instr.instruction).args; int args = instructionInfo(instr.instruction).args;
bool requireFunctionalNotation = (args > 0 || m_flavour != AsmFlavour::Loose); if (args > 0 && currentToken() != Token::LParen)
if (requireFunctionalNotation && currentToken() != Token::LParen)
fatalParserError(string( fatalParserError(string(
"Expected token \"(\" (\"" + "Expected token \"(\" (\"" +
instructionNames().at(instr.instruction) + instructionNames().at(instr.instruction) +

View File

@ -480,11 +480,11 @@ BOOST_AUTO_TEST_CASE(no_opcodes_in_strict)
{ {
BOOST_CHECK(successParse("{ pop(callvalue) }")); BOOST_CHECK(successParse("{ pop(callvalue) }"));
BOOST_CHECK(successParse("{ callvalue pop }")); BOOST_CHECK(successParse("{ callvalue pop }"));
CHECK_STRICT_ERROR("{ pop(callvalue) }", ParserError, "Instruction \"callvalue\" not allowed in this context"); CHECK_STRICT_ERROR("{ pop(callvalue) }", ParserError, "Non-functional instructions are not allowed in this context.");
CHECK_STRICT_ERROR("{ callvalue pop }", ParserError, "Call or assignment expected"); CHECK_STRICT_ERROR("{ callvalue pop }", ParserError, "Call or assignment expected");
SUCCESS_STRICT("{ pop(callvalue()) }"); SUCCESS_STRICT("{ pop(callvalue()) }");
BOOST_CHECK(successParse("{ switch callvalue case 0 {} }")); BOOST_CHECK(successParse("{ switch callvalue case 0 {} }"));
CHECK_STRICT_ERROR("{ switch callvalue case 0 {} }", ParserError, "Instruction \"callvalue\" not allowed in this context"); CHECK_STRICT_ERROR("{ switch callvalue case 0 {} }", ParserError, "Non-functional instructions are not allowed in this context.");
} }
BOOST_AUTO_TEST_CASE(no_labels_in_strict) BOOST_AUTO_TEST_CASE(no_labels_in_strict)