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.
|
||||
}
|
||||
|
||||
.. 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
|
||||
----------------------------------
|
||||
|
||||
@ -699,7 +694,7 @@ The following assembly will be generated::
|
||||
mstore(ret, r)
|
||||
return(ret, 0x20)
|
||||
}
|
||||
default: { jump(invalidJumpLabel) }
|
||||
default: { revert(0, 0) }
|
||||
// memory allocator
|
||||
function $allocate(size) -> pos {
|
||||
pos := mload(0x40)
|
||||
@ -744,7 +739,7 @@ After the desugaring phase it looks as follows::
|
||||
}
|
||||
$caseDefault:
|
||||
{
|
||||
jump(invalidJumpLabel)
|
||||
revert(0, 0)
|
||||
jump($endswitch)
|
||||
}
|
||||
$endswitch:
|
||||
|
@ -299,25 +299,6 @@ void CompilerUtils::zeroInitialiseMemoryArray(ArrayType const& _type)
|
||||
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()
|
||||
{
|
||||
// Stack here: size target source
|
||||
|
@ -109,10 +109,6 @@ public:
|
||||
/// Stack post: <updated_memptr>
|
||||
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.
|
||||
/// Stack pre: <size> <target> <source>
|
||||
/// Stack post:
|
||||
|
@ -278,8 +278,6 @@ private:
|
||||
{
|
||||
if (_label.id == Scope::Label::unassignedLabelId)
|
||||
_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
|
||||
{
|
||||
size_t id = unassignedLabelId;
|
||||
static const size_t errorLabelId = -1;
|
||||
static const size_t unassignedLabelId = 0;
|
||||
};
|
||||
|
||||
|
@ -39,10 +39,6 @@ using namespace dev::solidity::assembly;
|
||||
ScopeFiller::ScopeFiller(ScopeFiller::Scopes& _scopes, ErrorList& _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);
|
||||
}
|
||||
|
||||
|
@ -358,7 +358,7 @@ BOOST_AUTO_TEST_CASE(imbalanced_stack)
|
||||
|
||||
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)
|
||||
|
@ -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_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)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
|
Loading…
Reference in New Issue
Block a user