mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add helpers for isPush/isDup/isSwap
This commit is contained in:
parent
ba7c5d2305
commit
8a32d7c3d7
@ -197,6 +197,24 @@ enum class Instruction: uint8_t
|
|||||||
SELFDESTRUCT = 0xff ///< halt execution and register account for later deletion
|
SELFDESTRUCT = 0xff ///< halt execution and register account for later deletion
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @returns true if the instruction is a PUSH
|
||||||
|
inline bool isPushInstruction(Instruction _inst)
|
||||||
|
{
|
||||||
|
return Instruction::PUSH1 <= _inst && _inst <= Instruction::PUSH32;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @returns true if the instruction is a DUP
|
||||||
|
inline bool isDupInstruction(Instruction _inst)
|
||||||
|
{
|
||||||
|
return Instruction::DUP1 <= _inst && _inst <= Instruction::DUP16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @returns true if the instruction is a SWAP
|
||||||
|
inline bool isSwapInstruction(Instruction _inst)
|
||||||
|
{
|
||||||
|
return Instruction::SWAP1 <= _inst && _inst <= Instruction::SWAP16;
|
||||||
|
}
|
||||||
|
|
||||||
/// @returns the number of PUSH Instruction _inst
|
/// @returns the number of PUSH Instruction _inst
|
||||||
inline unsigned getPushNumber(Instruction _inst)
|
inline unsigned getPushNumber(Instruction _inst)
|
||||||
{
|
{
|
||||||
|
@ -256,7 +256,7 @@ std::map<string, dev::solidity::Instruction> const& Parser::instructions()
|
|||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
instruction.second == solidity::Instruction::JUMPDEST ||
|
instruction.second == solidity::Instruction::JUMPDEST ||
|
||||||
(solidity::Instruction::PUSH1 <= instruction.second && instruction.second <= solidity::Instruction::PUSH32)
|
solidity::isPushInstruction(instruction.second)
|
||||||
)
|
)
|
||||||
continue;
|
continue;
|
||||||
string name = instruction.first;
|
string name = instruction.first;
|
||||||
@ -443,9 +443,9 @@ assembly::Statement Parser::parseCall(assembly::Statement&& _instruction)
|
|||||||
ret.location = ret.instruction.location;
|
ret.location = ret.instruction.location;
|
||||||
solidity::Instruction instr = ret.instruction.instruction;
|
solidity::Instruction instr = ret.instruction.instruction;
|
||||||
InstructionInfo instrInfo = instructionInfo(instr);
|
InstructionInfo instrInfo = instructionInfo(instr);
|
||||||
if (solidity::Instruction::DUP1 <= instr && instr <= solidity::Instruction::DUP16)
|
if (solidity::isDupInstruction(instr))
|
||||||
fatalParserError("DUPi instructions not allowed for functional notation");
|
fatalParserError("DUPi instructions not allowed for functional notation");
|
||||||
if (solidity::Instruction::SWAP1 <= instr && instr <= solidity::Instruction::SWAP16)
|
if (solidity::isSwapInstruction(instr))
|
||||||
fatalParserError("SWAPi instructions not allowed for functional notation");
|
fatalParserError("SWAPi instructions not allowed for functional notation");
|
||||||
expectToken(Token::LParen);
|
expectToken(Token::LParen);
|
||||||
unsigned args = unsigned(instrInfo.args);
|
unsigned args = unsigned(instrInfo.args);
|
||||||
|
Loading…
Reference in New Issue
Block a user