Do not allow shadowing inline assembly instructions with variables

This commit is contained in:
Alex Beregszaszi 2017-01-25 10:33:09 +00:00
parent ba9a045002
commit 900c56d996
3 changed files with 12 additions and 1 deletions

View File

@ -10,6 +10,7 @@ Features:
Bugfixes: Bugfixes:
* Code generator: Allow recursive structs. * Code generator: Allow recursive structs.
* Inline assembly: reject shadowing instructions by variables.
* Type checker: Allow multiple events of the same name (but with different arities or argument types) * Type checker: Allow multiple events of the same name (but with different arities or argument types)
### 0.4.8 (2017-01-13) ### 0.4.8 (2017-01-13)

View File

@ -130,7 +130,7 @@ assembly::Statement Parser::parseExpression()
return operation; return operation;
} }
assembly::Statement Parser::parseElementaryOperation(bool _onlySinglePusher) std::map<string, dev::solidity::Instruction> Parser::getInstructions()
{ {
// Allowed instructions, lowercase names. // Allowed instructions, lowercase names.
static map<string, dev::solidity::Instruction> s_instructions; static map<string, dev::solidity::Instruction> s_instructions;
@ -151,6 +151,12 @@ assembly::Statement Parser::parseElementaryOperation(bool _onlySinglePusher)
// add alias for selfdestruct // add alias for selfdestruct
s_instructions["selfdestruct"] = solidity::Instruction::SUICIDE; s_instructions["selfdestruct"] = solidity::Instruction::SUICIDE;
} }
return s_instructions;
}
assembly::Statement Parser::parseElementaryOperation(bool _onlySinglePusher)
{
map<string, dev::solidity::Instruction> s_instructions = getInstructions();
Statement ret; Statement ret;
switch (m_scanner->currentToken()) switch (m_scanner->currentToken())
@ -204,9 +210,12 @@ assembly::Statement Parser::parseElementaryOperation(bool _onlySinglePusher)
assembly::VariableDeclaration Parser::parseVariableDeclaration() assembly::VariableDeclaration Parser::parseVariableDeclaration()
{ {
map<string, dev::solidity::Instruction> s_instructions = getInstructions();
VariableDeclaration varDecl = createWithLocation<VariableDeclaration>(); VariableDeclaration varDecl = createWithLocation<VariableDeclaration>();
expectToken(Token::Let); expectToken(Token::Let);
varDecl.name = m_scanner->currentLiteral(); varDecl.name = m_scanner->currentLiteral();
if (s_instructions.count(varDecl.name))
fatalParserError("Cannot shadow instructions with variable declaration.");
expectToken(Token::Identifier); expectToken(Token::Identifier);
expectToken(Token::Colon); expectToken(Token::Colon);
expectToken(Token::Assign); expectToken(Token::Assign);

View File

@ -64,6 +64,7 @@ protected:
Statement parseStatement(); Statement parseStatement();
/// Parses a functional expression that has to push exactly one stack element /// Parses a functional expression that has to push exactly one stack element
Statement parseExpression(); Statement parseExpression();
std::map<std::string, dev::solidity::Instruction> getInstructions();
Statement parseElementaryOperation(bool _onlySinglePusher = false); Statement parseElementaryOperation(bool _onlySinglePusher = false);
VariableDeclaration parseVariableDeclaration(); VariableDeclaration parseVariableDeclaration();
FunctionalInstruction parseFunctionalInstruction(Statement&& _instruction); FunctionalInstruction parseFunctionalInstruction(Statement&& _instruction);