mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge remote-tracking branch 'upstream/develop' into NewStateTests
Conflicts: test/state.cpp test/tmpFiller.json
This commit is contained in:
commit
43bab79fbc
@ -57,7 +57,6 @@ public:
|
|||||||
eth::State m_statePost;
|
eth::State m_statePost;
|
||||||
eth::ExtVMFace m_environment;
|
eth::ExtVMFace m_environment;
|
||||||
eth::Transaction m_transaction;
|
eth::Transaction m_transaction;
|
||||||
bytes code;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
json_spirit::mObject& m_TestObject;
|
json_spirit::mObject& m_TestObject;
|
||||||
|
@ -134,7 +134,7 @@ void doMyTests(json_spirit::mValue& v)
|
|||||||
o["pre"] = mValue(fev.exportState());
|
o["pre"] = mValue(fev.exportState());
|
||||||
|
|
||||||
fev.importExec(o["exec"].get_obj());
|
fev.importExec(o["exec"].get_obj());
|
||||||
if (!fev.code.size())
|
if (fev.code.empty())
|
||||||
{
|
{
|
||||||
fev.thisTxCode = get<3>(fev.addresses.at(fev.myAddress));
|
fev.thisTxCode = get<3>(fev.addresses.at(fev.myAddress));
|
||||||
fev.code = fev.thisTxCode;
|
fev.code = fev.thisTxCode;
|
||||||
|
@ -119,7 +119,7 @@ BOOST_AUTO_TEST_CASE(different_argument_numbers)
|
|||||||
byte(Instruction::JUMPDEST), // beginning of g
|
byte(Instruction::JUMPDEST), // beginning of g
|
||||||
byte(Instruction::PUSH1), 0x0,
|
byte(Instruction::PUSH1), 0x0,
|
||||||
byte(Instruction::DUP1), // initialized e and h
|
byte(Instruction::DUP1), // initialized e and h
|
||||||
byte(Instruction::PUSH1), 0x29 + shift, // ret address
|
byte(Instruction::PUSH1), byte(0x29 + shift), // ret address
|
||||||
byte(Instruction::PUSH1), 0x1, byte(Instruction::PUSH1), 0xff, byte(Instruction::AND),
|
byte(Instruction::PUSH1), 0x1, byte(Instruction::PUSH1), 0xff, byte(Instruction::AND),
|
||||||
byte(Instruction::PUSH1), 0x2, byte(Instruction::PUSH1), 0xff, byte(Instruction::AND),
|
byte(Instruction::PUSH1), 0x2, byte(Instruction::PUSH1), 0xff, byte(Instruction::AND),
|
||||||
byte(Instruction::PUSH1), 0x3, byte(Instruction::PUSH1), 0xff, byte(Instruction::AND),
|
byte(Instruction::PUSH1), 0x3, byte(Instruction::PUSH1), 0xff, byte(Instruction::AND),
|
||||||
|
@ -154,10 +154,10 @@ BOOST_AUTO_TEST_CASE(comparison)
|
|||||||
"}\n";
|
"}\n";
|
||||||
bytes code = compileFirstExpression(sourceCode);
|
bytes code = compileFirstExpression(sourceCode);
|
||||||
|
|
||||||
bytes expectation({byte(eth::Instruction::PUSH2), 0x10, 0xaa, byte(eth::Instruction::PUSH2), 0xff, 0xff, byte(eth::Instruction::AND),
|
bytes expectation({byte(eth::Instruction::PUSH1), 0x1,
|
||||||
byte(eth::Instruction::PUSH2), 0x11, 0xaa, byte(eth::Instruction::PUSH2), 0xff, 0xff, byte(eth::Instruction::AND),
|
byte(eth::Instruction::PUSH2), 0x11, 0xaa, byte(eth::Instruction::PUSH2), 0xff, 0xff, byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::GT),
|
byte(eth::Instruction::PUSH2), 0x10, 0xaa, byte(eth::Instruction::PUSH2), 0xff, 0xff, byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::PUSH1), 0x1,
|
byte(eth::Instruction::LT),
|
||||||
byte(eth::Instruction::EQ),
|
byte(eth::Instruction::EQ),
|
||||||
byte(eth::Instruction::ISZERO)});
|
byte(eth::Instruction::ISZERO)});
|
||||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||||
@ -166,7 +166,7 @@ BOOST_AUTO_TEST_CASE(comparison)
|
|||||||
BOOST_AUTO_TEST_CASE(short_circuiting)
|
BOOST_AUTO_TEST_CASE(short_circuiting)
|
||||||
{
|
{
|
||||||
char const* sourceCode = "contract test {\n"
|
char const* sourceCode = "contract test {\n"
|
||||||
" function f() { var x = (10 + 8 >= 4 || 2 != 9) != true; }"
|
" function f() { var x = true != (4 <= 8 + 10 || 9 != 2); }"
|
||||||
"}\n";
|
"}\n";
|
||||||
bytes code = compileFirstExpression(sourceCode);
|
bytes code = compileFirstExpression(sourceCode);
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ BOOST_AUTO_TEST_CASE(short_circuiting)
|
|||||||
BOOST_AUTO_TEST_CASE(arithmetics)
|
BOOST_AUTO_TEST_CASE(arithmetics)
|
||||||
{
|
{
|
||||||
char const* sourceCode = "contract test {\n"
|
char const* sourceCode = "contract test {\n"
|
||||||
" function f() { var x = (1 * (2 / (3 % (4 + (5 - (6 | (7 & (8 ^ 9)))))))); }"
|
" function f() { var x = ((((((((9 ^ 8) & 7) | 6) - 5) + 4) % 3) / 2) * 1); }"
|
||||||
"}\n";
|
"}\n";
|
||||||
bytes code = compileFirstExpression(sourceCode);
|
bytes code = compileFirstExpression(sourceCode);
|
||||||
bytes expectation({byte(eth::Instruction::PUSH1), 0x1,
|
bytes expectation({byte(eth::Instruction::PUSH1), 0x1,
|
||||||
@ -211,14 +211,11 @@ BOOST_AUTO_TEST_CASE(arithmetics)
|
|||||||
byte(eth::Instruction::XOR),
|
byte(eth::Instruction::XOR),
|
||||||
byte(eth::Instruction::AND),
|
byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::OR),
|
byte(eth::Instruction::OR),
|
||||||
byte(eth::Instruction::SWAP1),
|
|
||||||
byte(eth::Instruction::SUB),
|
byte(eth::Instruction::SUB),
|
||||||
byte(eth::Instruction::ADD),
|
byte(eth::Instruction::ADD),
|
||||||
byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::SWAP1),
|
|
||||||
byte(eth::Instruction::MOD),
|
byte(eth::Instruction::MOD),
|
||||||
byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::SWAP1),
|
|
||||||
byte(eth::Instruction::DIV),
|
byte(eth::Instruction::DIV),
|
||||||
byte(eth::Instruction::MUL)});
|
byte(eth::Instruction::MUL)});
|
||||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||||
@ -231,11 +228,11 @@ BOOST_AUTO_TEST_CASE(unary_operators)
|
|||||||
"}\n";
|
"}\n";
|
||||||
bytes code = compileFirstExpression(sourceCode);
|
bytes code = compileFirstExpression(sourceCode);
|
||||||
|
|
||||||
bytes expectation({byte(eth::Instruction::PUSH1), 0x1,
|
bytes expectation({byte(eth::Instruction::PUSH1), 0x2, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
||||||
|
byte(eth::Instruction::PUSH1), 0x1,
|
||||||
byte(eth::Instruction::PUSH1), 0x0,
|
byte(eth::Instruction::PUSH1), 0x0,
|
||||||
byte(eth::Instruction::SUB),
|
byte(eth::Instruction::SUB),
|
||||||
byte(eth::Instruction::NOT), byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
byte(eth::Instruction::NOT), byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::PUSH1), 0x2, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
|
||||||
byte(eth::Instruction::EQ),
|
byte(eth::Instruction::EQ),
|
||||||
byte(eth::Instruction::ISZERO)});
|
byte(eth::Instruction::ISZERO)});
|
||||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||||
@ -244,7 +241,7 @@ BOOST_AUTO_TEST_CASE(unary_operators)
|
|||||||
BOOST_AUTO_TEST_CASE(unary_inc_dec)
|
BOOST_AUTO_TEST_CASE(unary_inc_dec)
|
||||||
{
|
{
|
||||||
char const* sourceCode = "contract test {\n"
|
char const* sourceCode = "contract test {\n"
|
||||||
" function f(uint a) { var x = ((a++ ^ ++a) ^ a--) ^ --a; }"
|
" function f(uint a) { var x = --a ^ (a-- ^ (++a ^ a++)); }"
|
||||||
"}\n";
|
"}\n";
|
||||||
bytes code = compileFirstExpression(sourceCode, {}, {{"test", "f", "a"}, {"test", "f", "x"}});
|
bytes code = compileFirstExpression(sourceCode, {}, {{"test", "f", "a"}, {"test", "f", "x"}});
|
||||||
|
|
||||||
@ -299,16 +296,15 @@ BOOST_AUTO_TEST_CASE(assignment)
|
|||||||
bytes code = compileFirstExpression(sourceCode, {}, {{"test", "f", "a"}, {"test", "f", "b"}});
|
bytes code = compileFirstExpression(sourceCode, {}, {{"test", "f", "a"}, {"test", "f", "b"}});
|
||||||
|
|
||||||
// Stack: a, b
|
// Stack: a, b
|
||||||
bytes expectation({byte(eth::Instruction::DUP1),
|
bytes expectation({byte(eth::Instruction::PUSH1), 0x2, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::DUP3),
|
|
||||||
byte(eth::Instruction::SWAP1),
|
|
||||||
byte(eth::Instruction::ADD),
|
|
||||||
// Stack here: a b a+b
|
|
||||||
byte(eth::Instruction::SWAP2),
|
|
||||||
byte(eth::Instruction::POP),
|
|
||||||
byte(eth::Instruction::DUP2),
|
byte(eth::Instruction::DUP2),
|
||||||
// Stack here: a+b b a+b
|
byte(eth::Instruction::DUP4),
|
||||||
byte(eth::Instruction::PUSH1), 0x2, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
byte(eth::Instruction::ADD),
|
||||||
|
// Stack here: a b 2 a+b
|
||||||
|
byte(eth::Instruction::SWAP3),
|
||||||
|
byte(eth::Instruction::POP),
|
||||||
|
byte(eth::Instruction::DUP3),
|
||||||
|
// Stack here: a+b b 2 a+b
|
||||||
byte(eth::Instruction::MUL)});
|
byte(eth::Instruction::MUL)});
|
||||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||||
}
|
}
|
||||||
@ -323,21 +319,20 @@ BOOST_AUTO_TEST_CASE(function_call)
|
|||||||
{{"test", "f", "a"}, {"test", "f", "b"}});
|
{{"test", "f", "a"}, {"test", "f", "b"}});
|
||||||
|
|
||||||
// Stack: a, b
|
// Stack: a, b
|
||||||
bytes expectation({byte(eth::Instruction::PUSH1), 0x0d,
|
bytes expectation({byte(eth::Instruction::PUSH1), 0x02, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
||||||
byte(eth::Instruction::DUP3),
|
byte(eth::Instruction::PUSH1), 0x12,
|
||||||
byte(eth::Instruction::PUSH1), 0x01, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
byte(eth::Instruction::PUSH1), 0x01, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
||||||
|
byte(eth::Instruction::DUP5),
|
||||||
byte(eth::Instruction::ADD),
|
byte(eth::Instruction::ADD),
|
||||||
// Stack here: a b <ret label> (a+1)
|
// Stack here: a b 2 <ret label> (a+1)
|
||||||
byte(eth::Instruction::DUP3),
|
byte(eth::Instruction::DUP4),
|
||||||
byte(eth::Instruction::PUSH1), 0x1a,
|
byte(eth::Instruction::PUSH1), 0x19,
|
||||||
byte(eth::Instruction::JUMP),
|
byte(eth::Instruction::JUMP),
|
||||||
byte(eth::Instruction::JUMPDEST),
|
byte(eth::Instruction::JUMPDEST),
|
||||||
// Stack here: a b g(a+1, b)
|
// Stack here: a b 2 g(a+1, b)
|
||||||
byte(eth::Instruction::PUSH1), 0x02, byte(eth::Instruction::PUSH1), 0xff, byte(eth::Instruction::AND),
|
|
||||||
byte(eth::Instruction::MUL),
|
byte(eth::Instruction::MUL),
|
||||||
// Stack here: a b g(a+1, b)*2
|
// Stack here: a b g(a+1, b)*2
|
||||||
byte(eth::Instruction::DUP3),
|
byte(eth::Instruction::DUP3),
|
||||||
byte(eth::Instruction::SWAP1),
|
|
||||||
byte(eth::Instruction::ADD),
|
byte(eth::Instruction::ADD),
|
||||||
// Stack here: a b a+g(a+1, b)*2
|
// Stack here: a b a+g(a+1, b)*2
|
||||||
byte(eth::Instruction::SWAP2),
|
byte(eth::Instruction::SWAP2),
|
||||||
@ -355,15 +350,15 @@ BOOST_AUTO_TEST_CASE(negative_literals_8bits)
|
|||||||
"}\n";
|
"}\n";
|
||||||
bytes code = compileFirstExpression(sourceCode);
|
bytes code = compileFirstExpression(sourceCode);
|
||||||
|
|
||||||
bytes expectation(bytes({byte(eth::Instruction::PUSH1), 0x00,
|
bytes expectation(bytes({byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x80) +
|
||||||
byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
bytes({byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x81) +
|
||||||
bytes({byte(eth::Instruction::ADD),
|
bytes({byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
||||||
byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
bytes({byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
||||||
bytes({byte(eth::Instruction::ADD),
|
bytes({byte(eth::Instruction::PUSH1), 0x00,
|
||||||
byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x81) +
|
byte(eth::Instruction::ADD),
|
||||||
bytes({byte(eth::Instruction::ADD),
|
byte(eth::Instruction::ADD),
|
||||||
byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x80) +
|
byte(eth::Instruction::ADD),
|
||||||
bytes({byte(eth::Instruction::ADD)}));
|
byte(eth::Instruction::ADD)}));
|
||||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,11 +371,11 @@ BOOST_AUTO_TEST_CASE(negative_literals_16bits)
|
|||||||
"}\n";
|
"}\n";
|
||||||
bytes code = compileFirstExpression(sourceCode);
|
bytes code = compileFirstExpression(sourceCode);
|
||||||
|
|
||||||
bytes expectation(bytes({byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
bytes expectation(bytes({byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x7f) +
|
||||||
|
bytes({byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
||||||
bytes({byte(eth::Instruction::PUSH1), 0x00,
|
bytes({byte(eth::Instruction::PUSH1), 0x00,
|
||||||
byte(eth::Instruction::SIGNEXTEND),
|
byte(eth::Instruction::SIGNEXTEND),
|
||||||
byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x7f) +
|
byte(eth::Instruction::ADD),
|
||||||
bytes({byte(eth::Instruction::ADD),
|
|
||||||
byte(eth::Instruction::PUSH1), 0x01,
|
byte(eth::Instruction::PUSH1), 0x01,
|
||||||
byte(eth::Instruction::SIGNEXTEND)}));
|
byte(eth::Instruction::SIGNEXTEND)}));
|
||||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||||
|
@ -54,13 +54,7 @@ void doStateTests(json_spirit::mValue& v, bool _fillin)
|
|||||||
|
|
||||||
ImportTest importer(o, _fillin);
|
ImportTest importer(o, _fillin);
|
||||||
|
|
||||||
if (_fillin)
|
State theState = importer.m_statePre;
|
||||||
{
|
|
||||||
importer.code = importer.m_statePre.code(importer.m_environment.myAddress);
|
|
||||||
importer.m_environment.code = importer.code;
|
|
||||||
}
|
|
||||||
|
|
||||||
State theState = importer.m_statePre;
|
|
||||||
bytes tx = importer.m_transaction.rlp();
|
bytes tx = importer.m_transaction.rlp();
|
||||||
bytes output;
|
bytes output;
|
||||||
|
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"CallRecursiveBomb2": {
|
|
||||||
"env" : {
|
|
||||||
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
|
|
||||||
"currentNumber" : "0",
|
|
||||||
"currentGasLimit" : "10000000",
|
|
||||||
"currentDifficulty" : "256",
|
|
||||||
"currentTimestamp" : 1,
|
|
||||||
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
|
|
||||||
},
|
|
||||||
"pre" : {
|
|
||||||
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
|
||||||
"balance" : "20000000",
|
|
||||||
"nonce" : 0,
|
|
||||||
"code" : "{ [[ 0 ]] (+ (SLOAD 0) 1) [[ 1 ]] (CALL (- (GAS) 224) (ADDRESS) 0 0 0 0 0) }",
|
|
||||||
"storage": {}
|
|
||||||
},
|
|
||||||
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
|
||||||
"balance" : "1000000000000000000",
|
|
||||||
"nonce" : 0,
|
|
||||||
"code" : "",
|
|
||||||
"storage": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"transaction" : {
|
|
||||||
"nonce" : "0",
|
|
||||||
"gasPrice" : "1",
|
|
||||||
"gasLimit" : "365224",
|
|
||||||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
|
||||||
"value" : "100000",
|
|
||||||
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
|
|
||||||
"data" : ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
2
vm.cpp
2
vm.cpp
@ -290,7 +290,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
|
|||||||
o["pre"] = mValue(fev.exportState());
|
o["pre"] = mValue(fev.exportState());
|
||||||
|
|
||||||
fev.importExec(o["exec"].get_obj());
|
fev.importExec(o["exec"].get_obj());
|
||||||
if (!fev.code.size())
|
if (fev.code.empty())
|
||||||
{
|
{
|
||||||
fev.thisTxCode = get<3>(fev.addresses.at(fev.myAddress));
|
fev.thisTxCode = get<3>(fev.addresses.at(fev.myAddress));
|
||||||
fev.code = fev.thisTxCode;
|
fev.code = fev.thisTxCode;
|
||||||
|
Loading…
Reference in New Issue
Block a user