From 28f10f4783bd4365654191740069a7112be03d92 Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 28 Apr 2017 13:09:48 +0200 Subject: Remove error label / invalid jump label. --- docs/assembly.rst | 9 ++------- libsolidity/codegen/CompilerUtils.cpp | 19 ------------------- libsolidity/codegen/CompilerUtils.h | 4 ---- libsolidity/inlineasm/AsmCodeGen.cpp | 2 -- libsolidity/inlineasm/AsmScope.h | 1 - libsolidity/inlineasm/AsmScopeFiller.cpp | 4 ---- test/libsolidity/InlineAssembly.cpp | 2 +- test/libsolidity/SolidityEndToEndTest.cpp | 15 --------------- 8 files changed, 3 insertions(+), 53 deletions(-) diff --git a/docs/assembly.rst b/docs/assembly.rst index 420cea17..07583a24 100644 --- a/docs/assembly.rst +++ b/docs/assembly.rst @@ -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: diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index dc0b340c..4ae9a09a 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -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 { - { "$identityContractAddress", toString(identityContractAddress) } - } - ); - m_context << Instruction::POP << Instruction::POP << Instruction::POP; -} - void CompilerUtils::memoryCopy32() { // Stack here: size target source diff --git a/libsolidity/codegen/CompilerUtils.h b/libsolidity/codegen/CompilerUtils.h index b9ed6757..4140ce8b 100644 --- a/libsolidity/codegen/CompilerUtils.h +++ b/libsolidity/codegen/CompilerUtils.h @@ -109,10 +109,6 @@ public: /// Stack post: void zeroInitialiseMemoryArray(ArrayType const& _type); - /// Uses a CALL to the identity contract to perform a memory-to-memory copy. - /// Stack pre: - /// Stack post: - void memoryCopyPrecompile(); /// Copies full 32 byte words in memory (regions cannot overlap), i.e. may copy more than length. /// Stack pre: /// Stack post: diff --git a/libsolidity/inlineasm/AsmCodeGen.cpp b/libsolidity/inlineasm/AsmCodeGen.cpp index 9ef3e6e7..c19667b4 100644 --- a/libsolidity/inlineasm/AsmCodeGen.cpp +++ b/libsolidity/inlineasm/AsmCodeGen.cpp @@ -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()); } diff --git a/libsolidity/inlineasm/AsmScope.h b/libsolidity/inlineasm/AsmScope.h index 37e0f0b8..b70bee67 100644 --- a/libsolidity/inlineasm/AsmScope.h +++ b/libsolidity/inlineasm/AsmScope.h @@ -73,7 +73,6 @@ struct Scope struct Label { size_t id = unassignedLabelId; - static const size_t errorLabelId = -1; static const size_t unassignedLabelId = 0; }; diff --git a/libsolidity/inlineasm/AsmScopeFiller.cpp b/libsolidity/inlineasm/AsmScopeFiller.cpp index de6fbdaa..4a651388 100644 --- a/libsolidity/inlineasm/AsmScopeFiller.cpp +++ b/libsolidity/inlineasm/AsmScopeFiller.cpp @@ -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); } diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 8bf4df8e..b7046f80 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -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) diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index f2f4b8b0..1ff0b6cb 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -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"( -- cgit v1.2.3