mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Correctly use not/bnot/iszero.
A long time ago, some opcodes were renamed. Now we should only have not (bitwise negation) and iszero (logical negation).
This commit is contained in:
parent
9e36bdda8a
commit
a927efb151
@ -208,7 +208,7 @@ idea is that assembly libraries will be used to enhance the language in such way
|
||||
// by using o_code = new bytes(size)
|
||||
o_code := mload(0x40)
|
||||
// new "memory end" including padding
|
||||
mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), bnot(0x1f))))
|
||||
mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
|
||||
// store length in memory
|
||||
mstore(o_code, size)
|
||||
// actually retrieve the code, this needs assembly
|
||||
@ -292,7 +292,7 @@ The opcodes `pushi` and `jumpdest` cannot be used directly.
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
| exp(x, y) | | x to the power of y |
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
| bnot(x) | | ~x, every bit of x is negated |
|
||||
| not(x) | | ~x, every bit of x is negated |
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
| lt(x, y) | | 1 if x < y, 0 otherwise |
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
@ -304,7 +304,7 @@ The opcodes `pushi` and `jumpdest` cannot be used directly.
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
| eq(x, y) | | 1 if x == y, 0 otherwise |
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
| not(x) | | 1 if x == 0, 0 otherwise |
|
||||
| iszero(x) | | 1 if x == 0, 0 otherwise |
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
| and(x, y) | | bitwise and of x and y |
|
||||
+-----------------------+------+---------------------------------------------------------------+
|
||||
|
@ -39,13 +39,13 @@ const std::map<std::string, Instruction> dev::solidity::c_instructions =
|
||||
{ "MOD", Instruction::MOD },
|
||||
{ "SMOD", Instruction::SMOD },
|
||||
{ "EXP", Instruction::EXP },
|
||||
{ "BNOT", Instruction::NOT },
|
||||
{ "NOT", Instruction::NOT },
|
||||
{ "LT", Instruction::LT },
|
||||
{ "GT", Instruction::GT },
|
||||
{ "SLT", Instruction::SLT },
|
||||
{ "SGT", Instruction::SGT },
|
||||
{ "EQ", Instruction::EQ },
|
||||
{ "NOT", Instruction::ISZERO },
|
||||
{ "ISZERO", Instruction::ISZERO },
|
||||
{ "AND", Instruction::AND },
|
||||
{ "OR", Instruction::OR },
|
||||
{ "XOR", Instruction::XOR },
|
||||
|
@ -6735,6 +6735,26 @@ BOOST_AUTO_TEST_CASE(internal_library_function_return_var_size)
|
||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(2)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(iszero_bnot_correct)
|
||||
{
|
||||
// A long time ago, some opcodes were renamed, which involved the opcodes
|
||||
// "iszero" and "not".
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
function f() returns (bool) {
|
||||
bytes32 x = 1;
|
||||
assembly { x := not(x) }
|
||||
if (x != ~bytes32(1)) return false;
|
||||
assembly { x := iszero(x) }
|
||||
if (x != bytes32(0)) return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "C");
|
||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs(true));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user