mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2194 from ethereum/removeerrorlabel
Remove error label / invalid jump label.
This commit is contained in:
commit
0582fcb93b
@ -431,11 +431,6 @@ As an example how this can be done in extreme cases, please see the following.
|
|||||||
pop // We have to pop the manually pushed value here again.
|
pop // We have to pop the manually pushed value here again.
|
||||||
}
|
}
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
``invalidJumpLabel`` is a pre-defined label. Jumping to this location will always
|
|
||||||
result in an invalid jump, effectively aborting execution of the code.
|
|
||||||
|
|
||||||
Declaring Assembly-Local Variables
|
Declaring Assembly-Local Variables
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
@ -699,7 +694,7 @@ The following assembly will be generated::
|
|||||||
mstore(ret, r)
|
mstore(ret, r)
|
||||||
return(ret, 0x20)
|
return(ret, 0x20)
|
||||||
}
|
}
|
||||||
default: { jump(invalidJumpLabel) }
|
default: { revert(0, 0) }
|
||||||
// memory allocator
|
// memory allocator
|
||||||
function $allocate(size) -> pos {
|
function $allocate(size) -> pos {
|
||||||
pos := mload(0x40)
|
pos := mload(0x40)
|
||||||
@ -744,7 +739,7 @@ After the desugaring phase it looks as follows::
|
|||||||
}
|
}
|
||||||
$caseDefault:
|
$caseDefault:
|
||||||
{
|
{
|
||||||
jump(invalidJumpLabel)
|
revert(0, 0)
|
||||||
jump($endswitch)
|
jump($endswitch)
|
||||||
}
|
}
|
||||||
$endswitch:
|
$endswitch:
|
||||||
|
@ -299,25 +299,6 @@ void CompilerUtils::zeroInitialiseMemoryArray(ArrayType const& _type)
|
|||||||
m_context << Instruction::SWAP1 << Instruction::POP;
|
m_context << Instruction::SWAP1 << Instruction::POP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompilerUtils::memoryCopyPrecompile()
|
|
||||||
{
|
|
||||||
// Stack here: size target source
|
|
||||||
|
|
||||||
m_context.appendInlineAssembly(R"(
|
|
||||||
{
|
|
||||||
let words := div(add(len, 31), 32)
|
|
||||||
let cost := add(15, mul(3, words))
|
|
||||||
jumpi(invalidJumpLabel, iszero(call(cost, $identityContractAddress, 0, src, len, dst, len)))
|
|
||||||
}
|
|
||||||
)",
|
|
||||||
{ "len", "dst", "src" },
|
|
||||||
map<string, string> {
|
|
||||||
{ "$identityContractAddress", toString(identityContractAddress) }
|
|
||||||
}
|
|
||||||
);
|
|
||||||
m_context << Instruction::POP << Instruction::POP << Instruction::POP;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CompilerUtils::memoryCopy32()
|
void CompilerUtils::memoryCopy32()
|
||||||
{
|
{
|
||||||
// Stack here: size target source
|
// Stack here: size target source
|
||||||
|
@ -109,10 +109,6 @@ public:
|
|||||||
/// Stack post: <updated_memptr>
|
/// Stack post: <updated_memptr>
|
||||||
void zeroInitialiseMemoryArray(ArrayType const& _type);
|
void zeroInitialiseMemoryArray(ArrayType const& _type);
|
||||||
|
|
||||||
/// Uses a CALL to the identity contract to perform a memory-to-memory copy.
|
|
||||||
/// Stack pre: <size> <target> <source>
|
|
||||||
/// Stack post:
|
|
||||||
void memoryCopyPrecompile();
|
|
||||||
/// Copies full 32 byte words in memory (regions cannot overlap), i.e. may copy more than length.
|
/// Copies full 32 byte words in memory (regions cannot overlap), i.e. may copy more than length.
|
||||||
/// Stack pre: <size> <target> <source>
|
/// Stack pre: <size> <target> <source>
|
||||||
/// Stack post:
|
/// Stack post:
|
||||||
|
@ -278,8 +278,6 @@ private:
|
|||||||
{
|
{
|
||||||
if (_label.id == Scope::Label::unassignedLabelId)
|
if (_label.id == Scope::Label::unassignedLabelId)
|
||||||
_label.id = m_state.newLabelId();
|
_label.id = m_state.newLabelId();
|
||||||
else if (_label.id == Scope::Label::errorLabelId)
|
|
||||||
_label.id = size_t(m_state.assembly.errorTag().data());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,7 +73,6 @@ struct Scope
|
|||||||
struct Label
|
struct Label
|
||||||
{
|
{
|
||||||
size_t id = unassignedLabelId;
|
size_t id = unassignedLabelId;
|
||||||
static const size_t errorLabelId = -1;
|
|
||||||
static const size_t unassignedLabelId = 0;
|
static const size_t unassignedLabelId = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -39,10 +39,6 @@ using namespace dev::solidity::assembly;
|
|||||||
ScopeFiller::ScopeFiller(ScopeFiller::Scopes& _scopes, ErrorList& _errors):
|
ScopeFiller::ScopeFiller(ScopeFiller::Scopes& _scopes, ErrorList& _errors):
|
||||||
m_scopes(_scopes), m_errors(_errors)
|
m_scopes(_scopes), m_errors(_errors)
|
||||||
{
|
{
|
||||||
// Make the Solidity ErrorTag available to inline assembly
|
|
||||||
Scope::Label errorLabel;
|
|
||||||
errorLabel.id = Scope::Label::errorLabelId;
|
|
||||||
scope(nullptr).identifiers["invalidJumpLabel"] = errorLabel;
|
|
||||||
m_currentScope = &scope(nullptr);
|
m_currentScope = &scope(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +358,7 @@ BOOST_AUTO_TEST_CASE(imbalanced_stack)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(error_tag)
|
BOOST_AUTO_TEST_CASE(error_tag)
|
||||||
{
|
{
|
||||||
BOOST_CHECK(successAssemble("{ jump(invalidJumpLabel) }"));
|
CHECK_ASSEMBLE_ERROR("{ jump(invalidJumpLabel) }", DeclarationError, "Identifier not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(designated_invalid_instruction)
|
BOOST_AUTO_TEST_CASE(designated_invalid_instruction)
|
||||||
|
@ -9126,21 +9126,6 @@ BOOST_AUTO_TEST_CASE(packed_storage_overflow)
|
|||||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0x1234), u256(0), u256(0), u256(0xfffe)));
|
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0x1234), u256(0), u256(0), u256(0xfffe)));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(inline_assembly_invalidjumplabel)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract C {
|
|
||||||
function f() {
|
|
||||||
assembly {
|
|
||||||
jump(invalidJumpLabel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
compileAndRun(sourceCode, 0, "C");
|
|
||||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs());
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(contracts_separated_with_comment)
|
BOOST_AUTO_TEST_CASE(contracts_separated_with_comment)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
|
Loading…
Reference in New Issue
Block a user