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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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