Merge pull request #2194 from ethereum/removeerrorlabel

Remove error label / invalid jump label.
This commit is contained in:
chriseth 2017-05-05 14:25:43 +02:00 committed by GitHub
commit 0582fcb93b
8 changed files with 3 additions and 53 deletions

View File

@ -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:

View File

@ -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

View File

@ -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:

View File

@ -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());
}

View File

@ -73,7 +73,6 @@ struct Scope
struct Label
{
size_t id = unassignedLabelId;
static const size_t errorLabelId = -1;
static const size_t unassignedLabelId = 0;
};

View File

@ -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);
}

View File

@ -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)

View File

@ -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"(