Merge pull request #5020 from ethereum/lll-seq-fix

LLL: terminate sequences with a STOP
This commit is contained in:
chriseth 2018-11-13 14:10:48 +01:00 committed by GitHub
commit c237013911
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 502 additions and 479 deletions

View File

@ -45,6 +45,10 @@ using namespace dev::lll;
void CodeFragment::finalise(CompilerState const& _cs) void CodeFragment::finalise(CompilerState const& _cs)
{ {
// NOTE: add this as a safeguard in case the user didn't issue an
// explicit stop at the end of the sequence
m_asm.append(Instruction::STOP);
if (_cs.usedAlloc && _cs.vars.size() && !m_finalised) if (_cs.usedAlloc && _cs.vars.size() && !m_finalised)
{ {
m_finalised = true; m_finalised = true;
@ -232,7 +236,12 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s)
int c = 0; int c = 0;
for (auto const& i: _t) for (auto const& i: _t)
if (c++) if (c++)
m_asm.append(CodeFragment(i, _s, m_readFile, true).m_asm); {
auto fragment = CodeFragment(i, _s, m_readFile, true).m_asm;
if ((m_asm.deposit() + fragment.deposit()) < 0)
error<IncorrectParameterCount>("The assembly instruction resulted in stack underflow");
m_asm.append(fragment);
}
} }
else if (us == "INCLUDE") else if (us == "INCLUDE")
{ {

View File

@ -147,215 +147,215 @@ BOOST_AUTO_TEST_CASE(disallowed_functional_asm_instructions)
BOOST_AUTO_TEST_CASE(valid_opcodes_functional) BOOST_AUTO_TEST_CASE(valid_opcodes_functional)
{ {
vector<string> opcodes_bytecode { vector<string> opcodes_bytecode {
"00", "0000",
"6000600001", "600060000100",
"6000600002", "600060000200",
"6000600003", "600060000300",
"6000600004", "600060000400",
"6000600005", "600060000500",
"6000600006", "600060000600",
"6000600007", "600060000700",
"60006000600008", "6000600060000800",
"60006000600009", "6000600060000900",
"600060000a", "600060000a00",
"600060000b", "600060000b00",
"6000600010", "600060001000",
"6000600011", "600060001100",
"6000600012", "600060001200",
"6000600013", "600060001300",
"6000600014", "600060001400",
"600015", "60001500",
"6000600016", "600060001600",
"6000600017", "600060001700",
"6000600018", "600060001800",
"600019", "60001900",
"600060001a", "600060001a00",
"6000600020", "600060002000",
"30", "3000",
"600031", "60003100",
"32", "3200",
"33", "3300",
"34", "3400",
"600035", "60003500",
"36", "3600",
"60006000600037", "6000600060003700",
"38", "3800",
"60006000600039", "6000600060003900",
"3a", "3a00",
"60003b", "60003b00",
"60006000600060003c", "60006000600060003c00",
"3d", "3d00",
"6000600060003e", "6000600060003e00",
"60003f", "60003f00",
"600040", "60004000",
"41", "4100",
"42", "4200",
"43", "4300",
"44", "4400",
"45", "4500",
"600050", "60005000",
"600051", "60005100",
"6000600052", "600060005200",
"6000600053", "600060005300",
"600054", "60005400",
"6000600055", "600060005500",
"600056", "60005600",
"6000600057", "600060005700",
"58", "5800",
"59", "5900",
"5a", "5a00",
"60ff", "60ff00",
"61ffff", "61ffff00",
"62ffffff", "62ffffff00",
"63ffffffff", "63ffffffff00",
"64ffffffffff", "64ffffffffff00",
"65ffffffffffff", "65ffffffffffff00",
"66ffffffffffffff", "66ffffffffffffff00",
"67ffffffffffffffff", "67ffffffffffffffff00",
"68ffffffffffffffffff", "68ffffffffffffffffff00",
"69ffffffffffffffffffff", "69ffffffffffffffffffff00",
"6affffffffffffffffffffff", "6affffffffffffffffffffff00",
"6bffffffffffffffffffffffff", "6bffffffffffffffffffffffff00",
"6cffffffffffffffffffffffffff", "6cffffffffffffffffffffffffff00",
"6dffffffffffffffffffffffffffff", "6dffffffffffffffffffffffffffff00",
"6effffffffffffffffffffffffffffff", "6effffffffffffffffffffffffffffff00",
"6fffffffffffffffffffffffffffffffff", "6fffffffffffffffffffffffffffffffff00",
"70ffffffffffffffffffffffffffffffffff", "70ffffffffffffffffffffffffffffffffff00",
"71ffffffffffffffffffffffffffffffffffff", "71ffffffffffffffffffffffffffffffffffff00",
"72ffffffffffffffffffffffffffffffffffffff", "72ffffffffffffffffffffffffffffffffffffff00",
"73ffffffffffffffffffffffffffffffffffffffff", "73ffffffffffffffffffffffffffffffffffffffff00",
"74ffffffffffffffffffffffffffffffffffffffffff", "74ffffffffffffffffffffffffffffffffffffffffff00",
"75ffffffffffffffffffffffffffffffffffffffffffff", "75ffffffffffffffffffffffffffffffffffffffffffff00",
"76ffffffffffffffffffffffffffffffffffffffffffffff", "76ffffffffffffffffffffffffffffffffffffffffffffff00",
"77ffffffffffffffffffffffffffffffffffffffffffffffff", "77ffffffffffffffffffffffffffffffffffffffffffffffff00",
"78ffffffffffffffffffffffffffffffffffffffffffffffffff", "78ffffffffffffffffffffffffffffffffffffffffffffffffff00",
"79ffffffffffffffffffffffffffffffffffffffffffffffffffff", "79ffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7affffffffffffffffffffffffffffffffffffffffffffffffffffff", "7affffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"60006000a0", "60006000a000",
"600060006000a1", "600060006000a100",
"6000600060006000a2", "6000600060006000a200",
"60006000600060006000a3", "60006000600060006000a300",
"600060006000600060006000a4", "600060006000600060006000a400",
"600060006000f0", "600060006000f000",
"6000600060006000600060006000f1", "6000600060006000600060006000f100",
"6000600060006000600060006000f2", "6000600060006000600060006000f200",
"60006000f3", "60006000f300",
"600060006000600060006000f4", "600060006000600060006000f400",
"600060006000600060006000fa", "600060006000600060006000fa00",
"60006000fd", "60006000fd00",
"fe", "fe00",
"6000ff" "6000ff00"
}; };
vector<string> opcodes_lll { vector<string> opcodes_lll {
"{ (STOP) }", "(STOP)",
"{ (ADD 0 0) }", "(ADD 0 0)",
"{ (MUL 0 0) }", "(MUL 0 0)",
"{ (SUB 0 0) }", "(SUB 0 0)",
"{ (DIV 0 0) }", "(DIV 0 0)",
"{ (SDIV 0 0) }", "(SDIV 0 0)",
"{ (MOD 0 0) }", "(MOD 0 0)",
"{ (SMOD 0 0) }", "(SMOD 0 0)",
"{ (ADDMOD 0 0 0) }", "(ADDMOD 0 0 0)",
"{ (MULMOD 0 0 0) }", "(MULMOD 0 0 0)",
"{ (EXP 0 0) }", "(EXP 0 0)",
"{ (SIGNEXTEND 0 0) }", "(SIGNEXTEND 0 0)",
"{ (LT 0 0) }", "(LT 0 0)",
"{ (GT 0 0) }", "(GT 0 0)",
"{ (SLT 0 0) }", "(SLT 0 0)",
"{ (SGT 0 0) }", "(SGT 0 0)",
"{ (EQ 0 0) }", "(EQ 0 0)",
"{ (ISZERO 0) }", "(ISZERO 0)",
"{ (AND 0 0) }", "(AND 0 0)",
"{ (OR 0 0) }", "(OR 0 0)",
"{ (XOR 0 0) }", "(XOR 0 0)",
"{ (NOT 0) }", "(NOT 0)",
"{ (BYTE 0 0) }", "(BYTE 0 0)",
"{ (KECCAK256 0 0) }", "(KECCAK256 0 0)",
"{ (ADDRESS) }", "(ADDRESS)",
"{ (BALANCE 0) }", "(BALANCE 0)",
"{ (ORIGIN) }", "(ORIGIN)",
"{ (CALLER) }", "(CALLER)",
"{ (CALLVALUE) }", "(CALLVALUE)",
"{ (CALLDATALOAD 0) }", "(CALLDATALOAD 0)",
"{ (CALLDATASIZE) }", "(CALLDATASIZE)",
"{ (CALLDATACOPY 0 0 0) }", "(CALLDATACOPY 0 0 0)",
"{ (CODESIZE) }", "(CODESIZE)",
"{ (CODECOPY 0 0 0) }", "(CODECOPY 0 0 0)",
"{ (GASPRICE) }", "(GASPRICE)",
"{ (EXTCODESIZE 0) }", "(EXTCODESIZE 0)",
"{ (EXTCODECOPY 0 0 0 0) }", "(EXTCODECOPY 0 0 0 0)",
"{ (RETURNDATASIZE) }", "(RETURNDATASIZE)",
"{ (RETURNDATACOPY 0 0 0) }", "(RETURNDATACOPY 0 0 0)",
"{ (EXTCODEHASH 0) }", "(EXTCODEHASH 0)",
"{ (BLOCKHASH 0) }", "(BLOCKHASH 0)",
"{ (COINBASE) }", "(COINBASE)",
"{ (TIMESTAMP) }", "(TIMESTAMP)",
"{ (NUMBER) }", "(NUMBER)",
"{ (DIFFICULTY) }", "(DIFFICULTY)",
"{ (GASLIMIT) }", "(GASLIMIT)",
"{ (POP 0) }", "(POP 0)",
"{ (MLOAD 0) }", "(MLOAD 0)",
"{ (MSTORE 0 0) }", "(MSTORE 0 0)",
"{ (MSTORE8 0 0) }", "(MSTORE8 0 0)",
"{ (SLOAD 0) }", "(SLOAD 0)",
"{ (SSTORE 0 0) }", "(SSTORE 0 0)",
"{ (JUMP 0) }", "(JUMP 0)",
"{ (JUMPI 0 0) }", "(JUMPI 0 0)",
"{ (PC) }", "(PC)",
"{ (MSIZE) }", "(MSIZE)",
"{ (GAS) }", "(GAS)",
"{ 0xff }", "0xff",
"{ 0xffff }", "0xffff",
"{ 0xffffff }", "0xffffff",
"{ 0xffffffff }", "0xffffffff",
"{ 0xffffffffff }", "0xffffffffff",
"{ 0xffffffffffff }", "0xffffffffffff",
"{ 0xffffffffffffff }", "0xffffffffffffff",
"{ 0xffffffffffffffff }", "0xffffffffffffffff",
"{ 0xffffffffffffffffff }", "0xffffffffffffffffff",
"{ 0xffffffffffffffffffff }", "0xffffffffffffffffffff",
"{ 0xffffffffffffffffffffff }", "0xffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffff }", "0xffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff }", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"{ (LOG0 0 0) }", "(LOG0 0 0)",
"{ (LOG1 0 0 0) }", "(LOG1 0 0 0)",
"{ (LOG2 0 0 0 0) }", "(LOG2 0 0 0 0)",
"{ (LOG3 0 0 0 0 0) }", "(LOG3 0 0 0 0 0)",
"{ (LOG4 0 0 0 0 0 0) }", "(LOG4 0 0 0 0 0 0)",
"{ (CREATE 0 0 0) }", "(CREATE 0 0 0)",
"{ (CALL 0 0 0 0 0 0 0) }", "(CALL 0 0 0 0 0 0 0)",
"{ (CALLCODE 0 0 0 0 0 0 0) }", "(CALLCODE 0 0 0 0 0 0 0)",
"{ (RETURN 0 0) }", "(RETURN 0 0)",
"{ (DELEGATECALL 0 0 0 0 0 0) }", "(DELEGATECALL 0 0 0 0 0 0)",
"{ (STATICCALL 0 0 0 0 0 0) }", "(STATICCALL 0 0 0 0 0 0)",
"{ (REVERT 0 0) }", "(REVERT 0 0)",
"{ (INVALID) }", "(INVALID)",
"{ (SELFDESTRUCT 0) }" "(SELFDESTRUCT 0)"
}; };
for (size_t i = 0; i < opcodes_bytecode.size(); i++) for (size_t i = 0; i < opcodes_bytecode.size(); i++)
@ -372,281 +372,281 @@ BOOST_AUTO_TEST_CASE(valid_opcodes_functional)
BOOST_AUTO_TEST_CASE(valid_opcodes_asm) BOOST_AUTO_TEST_CASE(valid_opcodes_asm)
{ {
vector<string> opcodes_bytecode { vector<string> opcodes_bytecode {
"00", "0000",
"01", "600060000100",
"02", "600060000200",
"03", "600060000300",
"04", "600060000400",
"05", "600060000500",
"06", "600060000600",
"07", "600060000700",
"08", "6000600060000800",
"09", "6000600060000900",
"0a", "600060000a00",
"0b", "600060000b00",
"10", "600060001000",
"11", "600060001100",
"12", "600060001200",
"13", "600060001300",
"14", "600060001400",
"15", "60001500",
"16", "600060001600",
"17", "600060001700",
"18", "600060001800",
"19", "60001900",
"1a", "600060001a00",
"20", "600060002000",
"30", "3000",
"31", "60003100",
"32", "3200",
"33", "3300",
"34", "3400",
"35", "60003500",
"36", "3600",
"37", "6000600060003700",
"38", "3800",
"39", "6000600060003900",
"3a", "3a00",
"3b", "60003b00",
"3c", "60006000600060003c00",
"3d", "3d00",
"3e", "6000600060003e00",
"3f", "60003f00",
"40", "4000",
"41", "4100",
"42", "4200",
"43", "4300",
"44", "4400",
"45", "4500",
"50", "60005000",
"51", "60005100",
"52", "600060005200",
"53", "600060005300",
"54", "60005400",
"55", "600060005500",
"56", "60005600",
"57", "600060005700",
"58", "5800",
"59", "5900",
"5a", "5a00",
"5b", "5b00",
"60ff", "60ff00",
"61ffff", "61ffff00",
"62ffffff", "62ffffff00",
"63ffffffff", "63ffffffff00",
"64ffffffffff", "64ffffffffff00",
"65ffffffffffff", "65ffffffffffff00",
"66ffffffffffffff", "66ffffffffffffff00",
"67ffffffffffffffff", "67ffffffffffffffff00",
"68ffffffffffffffffff", "68ffffffffffffffffff00",
"69ffffffffffffffffffff", "69ffffffffffffffffffff00",
"6affffffffffffffffffffff", "6affffffffffffffffffffff00",
"6bffffffffffffffffffffffff", "6bffffffffffffffffffffffff00",
"6cffffffffffffffffffffffffff", "6cffffffffffffffffffffffffff00",
"6dffffffffffffffffffffffffffff", "6dffffffffffffffffffffffffffff00",
"6effffffffffffffffffffffffffffff", "6effffffffffffffffffffffffffffff00",
"6fffffffffffffffffffffffffffffffff", "6fffffffffffffffffffffffffffffffff00",
"70ffffffffffffffffffffffffffffffffff", "70ffffffffffffffffffffffffffffffffff00",
"71ffffffffffffffffffffffffffffffffffff", "71ffffffffffffffffffffffffffffffffffff00",
"72ffffffffffffffffffffffffffffffffffffff", "72ffffffffffffffffffffffffffffffffffffff00",
"73ffffffffffffffffffffffffffffffffffffffff", "73ffffffffffffffffffffffffffffffffffffffff00",
"74ffffffffffffffffffffffffffffffffffffffffff", "74ffffffffffffffffffffffffffffffffffffffffff00",
"75ffffffffffffffffffffffffffffffffffffffffffff", "75ffffffffffffffffffffffffffffffffffffffffffff00",
"76ffffffffffffffffffffffffffffffffffffffffffffff", "76ffffffffffffffffffffffffffffffffffffffffffffff00",
"77ffffffffffffffffffffffffffffffffffffffffffffffff", "77ffffffffffffffffffffffffffffffffffffffffffffffff00",
"78ffffffffffffffffffffffffffffffffffffffffffffffffff", "78ffffffffffffffffffffffffffffffffffffffffffffffffff00",
"79ffffffffffffffffffffffffffffffffffffffffffffffffffff", "79ffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7affffffffffffffffffffffffffffffffffffffffffffffffffffff", "7affffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
"80", "60006000600060006000600060006000600060006000600060006000600060008000",
"81", "60006000600060006000600060006000600060006000600060006000600060008100",
"82", "60006000600060006000600060006000600060006000600060006000600060008200",
"83", "60006000600060006000600060006000600060006000600060006000600060008300",
"84", "60006000600060006000600060006000600060006000600060006000600060008400",
"85", "60006000600060006000600060006000600060006000600060006000600060008500",
"86", "60006000600060006000600060006000600060006000600060006000600060008600",
"87", "60006000600060006000600060006000600060006000600060006000600060008700",
"88", "60006000600060006000600060006000600060006000600060006000600060008800",
"89", "60006000600060006000600060006000600060006000600060006000600060008900",
"8a", "60006000600060006000600060006000600060006000600060006000600060008a00",
"8b", "60006000600060006000600060006000600060006000600060006000600060008b00",
"8c", "60006000600060006000600060006000600060006000600060006000600060008c00",
"8d", "60006000600060006000600060006000600060006000600060006000600060008d00",
"8e", "60006000600060006000600060006000600060006000600060006000600060008e00",
"8f", "60006000600060006000600060006000600060006000600060006000600060008f00",
"90", "60006000600060006000600060006000600060006000600060006000600060009000",
"91", "60006000600060006000600060006000600060006000600060006000600060009100",
"92", "60006000600060006000600060006000600060006000600060006000600060009200",
"93", "60006000600060006000600060006000600060006000600060006000600060009300",
"94", "60006000600060006000600060006000600060006000600060006000600060009400",
"95", "60006000600060006000600060006000600060006000600060006000600060009500",
"96", "60006000600060006000600060006000600060006000600060006000600060009600",
"97", "60006000600060006000600060006000600060006000600060006000600060009700",
"98", "60006000600060006000600060006000600060006000600060006000600060009800",
"99", "60006000600060006000600060006000600060006000600060006000600060009900",
"9a", "60006000600060006000600060006000600060006000600060006000600060009a00",
"9b", "60006000600060006000600060006000600060006000600060006000600060009b00",
"9c", "60006000600060006000600060006000600060006000600060006000600060009c00",
"9d", "60006000600060006000600060006000600060006000600060006000600060009d00",
"9e", "60006000600060006000600060006000600060006000600060006000600060009e00",
"9f", "60006000600060006000600060006000600060006000600060006000600060009f00",
"a0", "60006000a000",
"a1", "600060006000a100",
"a2", "6000600060006000a200",
"a3", "60006000600060006000a300",
"a4", "600060006000600060006000a400",
"f0", "600060006000f000",
"f1", "600060006000600060006000f100",
"f2", "600060006000600060006000f200",
"f3", "60006000f300",
"f4", "60006000600060006000f400",
"fa", "60006000600060006000fa00",
"fd", "60006000fd00",
"fe", "fe00",
"ff" "6000ff00"
}; };
vector<string> opcodes_lll { vector<string> opcodes_lll {
"{ (asm STOP) }", "(asm STOP)",
"{ (asm ADD) }", "(asm 0 0 ADD)",
"{ (asm MUL) }", "(asm 0 0 MUL)",
"{ (asm SUB) }", "(asm 0 0 SUB)",
"{ (asm DIV) }", "(asm 0 0 DIV)",
"{ (asm SDIV ) }", "(asm 0 0 SDIV)",
"{ (asm MOD) }", "(asm 0 0 MOD)",
"{ (asm SMOD) }", "(asm 0 0 SMOD)",
"{ (asm ADDMOD) }", "(asm 0 0 0 ADDMOD)",
"{ (asm MULMOD) }", "(asm 0 0 0 MULMOD)",
"{ (asm EXP) }", "(asm 0 0 EXP)",
"{ (asm SIGNEXTEND) }", "(asm 0 0 SIGNEXTEND)",
"{ (asm LT) }", "(asm 0 0 LT)",
"{ (asm GT) }", "(asm 0 0 GT)",
"{ (asm SLT) }", "(asm 0 0 SLT)",
"{ (asm SGT) }", "(asm 0 0 SGT)",
"{ (asm EQ) }", "(asm 0 0 EQ)",
"{ (asm ISZERO) }", "(asm 0 ISZERO)",
"{ (asm AND) }", "(asm 0 0 AND)",
"{ (asm OR) }", "(asm 0 0 OR)",
"{ (asm XOR) }", "(asm 0 0 XOR)",
"{ (asm NOT) }", "(asm 0 NOT)",
"{ (asm BYTE) }", "(asm 0 0 BYTE)",
"{ (asm KECCAK256) }", "(asm 0 0 KECCAK256)",
"{ (asm ADDRESS) }", "(asm ADDRESS)",
"{ (asm BALANCE) }", "(asm 0 BALANCE)",
"{ (asm ORIGIN) }", "(asm ORIGIN)",
"{ (asm CALLER) }", "(asm CALLER)",
"{ (asm CALLVALUE) }", "(asm CALLVALUE)",
"{ (asm CALLDATALOAD) }", "(asm 0 CALLDATALOAD)",
"{ (asm CALLDATASIZE) }", "(asm CALLDATASIZE)",
"{ (asm CALLDATACOPY) }", "(asm 0 0 0 CALLDATACOPY)",
"{ (asm CODESIZE) }", "(asm CODESIZE)",
"{ (asm CODECOPY) }", "(asm 0 0 0 CODECOPY)",
"{ (asm GASPRICE) }", "(asm GASPRICE)",
"{ (asm EXTCODESIZE)}", "(asm 0 EXTCODESIZE)",
"{ (asm EXTCODECOPY) }", "(asm 0 0 0 0 EXTCODECOPY)",
"{ (asm RETURNDATASIZE) }", "(asm RETURNDATASIZE)",
"{ (asm RETURNDATACOPY) }", "(asm 0 0 0 RETURNDATACOPY)",
"{ (asm EXTCODEHASH) }", "(asm 0 EXTCODEHASH)",
"{ (asm BLOCKHASH) }", "(asm BLOCKHASH)",
"{ (asm COINBASE) }", "(asm COINBASE)",
"{ (asm TIMESTAMP) }", "(asm TIMESTAMP)",
"{ (asm NUMBER) }", "(asm NUMBER)",
"{ (asm DIFFICULTY) }", "(asm DIFFICULTY)",
"{ (asm GASLIMIT) }", "(asm GASLIMIT)",
"{ (asm POP) }", "(asm 0 POP)",
"{ (asm MLOAD) }", "(asm 0 MLOAD)",
"{ (asm MSTORE) }", "(asm 0 0 MSTORE)",
"{ (asm MSTORE8) }", "(asm 0 0 MSTORE8)",
"{ (asm SLOAD) }", "(asm 0 SLOAD)",
"{ (asm SSTORE) }", "(asm 0 0 SSTORE)",
"{ (asm JUMP ) }", "(asm 0 JUMP)",
"{ (asm JUMPI ) }", "(asm 0 0 JUMPI)",
"{ (asm PC) }", "(asm PC)",
"{ (asm MSIZE) }", "(asm MSIZE)",
"{ (asm GAS) }", "(asm GAS)",
"{ (asm JUMPDEST) }", "(asm JUMPDEST)",
"{ (asm 0xff) }", "(asm 0xff)",
"{ (asm 0xffff) }", "(asm 0xffff)",
"{ (asm 0xffffff) }", "(asm 0xffffff)",
"{ (asm 0xffffffff) }", "(asm 0xffffffff)",
"{ (asm 0xffffffffff) }", "(asm 0xffffffffff)",
"{ (asm 0xffffffffffff) }", "(asm 0xffffffffffff)",
"{ (asm 0xffffffffffffff) }", "(asm 0xffffffffffffff)",
"{ (asm 0xffffffffffffffff) }", "(asm 0xffffffffffffffff)",
"{ (asm 0xffffffffffffffffff) }", "(asm 0xffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffff) }", "(asm 0xffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) }", "(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
"{ (asm DUP1) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP1)",
"{ (asm DUP2) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP2)",
"{ (asm DUP3) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP3)",
"{ (asm DUP4) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP4)",
"{ (asm DUP5) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP5)",
"{ (asm DUP6) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP6)",
"{ (asm DUP7) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP7)",
"{ (asm DUP8) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP8)",
"{ (asm DUP9) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP9)",
"{ (asm DUP10) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP10)",
"{ (asm DUP11) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP11)",
"{ (asm DUP12) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP12)",
"{ (asm DUP13) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP13)",
"{ (asm DUP14) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP14)",
"{ (asm DUP15) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP15)",
"{ (asm DUP16) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP16)",
"{ (asm SWAP1) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP1)",
"{ (asm SWAP2) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP2)",
"{ (asm SWAP3) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP3)",
"{ (asm SWAP4) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP4)",
"{ (asm SWAP5) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP5)",
"{ (asm SWAP6) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP6)",
"{ (asm SWAP7) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP7)",
"{ (asm SWAP8) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP8)",
"{ (asm SWAP9) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP9)",
"{ (asm SWAP10) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP10)",
"{ (asm SWAP11) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP11)",
"{ (asm SWAP12) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP12)",
"{ (asm SWAP13) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP13)",
"{ (asm SWAP14) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP14)",
"{ (asm SWAP15) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP15)",
"{ (asm SWAP16) }", "(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP16)",
"{ (asm LOG0) }", "(asm 0 0 LOG0)",
"{ (asm LOG1) }", "(asm 0 0 0 LOG1)",
"{ (asm LOG2) }", "(asm 0 0 0 0 LOG2)",
"{ (asm LOG3) }", "(asm 0 0 0 0 0 LOG3)",
"{ (asm LOG4) }", "(asm 0 0 0 0 0 0 LOG4)",
"{ (asm CREATE) }", "(asm 0 0 0 CREATE)",
"{ (asm CALL) }", "(asm 0 0 0 0 0 0 CALL)",
"{ (asm CALLCODE) }", "(asm 0 0 0 0 0 0 CALLCODE)",
"{ (asm RETURN) }", "(asm 0 0 RETURN)",
"{ (asm DELEGATECALL) }", "(asm 0 0 0 0 0 DELEGATECALL)",
"{ (asm STATICCALL) }", "(asm 0 0 0 0 0 STATICCALL)",
"{ (asm REVERT) }", "(asm 0 0 REVERT)",
"{ (asm INVALID) }", "(asm INVALID)",
"{ (asm SELFDESTRUCT) }" "(asm 0 SELFDESTRUCT)"
}; };
for (size_t i = 0; i < opcodes_bytecode.size(); i++) for (size_t i = 0; i < opcodes_bytecode.size(); i++)

View File

@ -986,6 +986,20 @@ BOOST_AUTO_TEST_CASE(shift_right)
BOOST_CHECK(callFallback() == encodeArgs(u256(256))); BOOST_CHECK(callFallback() == encodeArgs(u256(256)));
} }
BOOST_AUTO_TEST_CASE(sub_assemblies)
{
char const* sourceCode = R"(
(returnlll
(return (create 0 (returnlll (sstore 1 1)))))
)";
compileAndRun(sourceCode);
bytes ret = callFallback();
BOOST_REQUIRE(ret.size() == 32);
u256 rVal = u256(toHex(ret, 2, HexPrefix::Add));
BOOST_CHECK(rVal != 0);
BOOST_CHECK(rVal < u256("0x10000000000000000000000000000000000000000"));
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
} }