aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-05-05 20:25:43 +0800
committerGitHub <noreply@github.com>2017-05-05 20:25:43 +0800
commit0582fcb93b2407379b5e4e4ce55c3f418e7ff433 (patch)
tree2770da9c5727476ff8b1ad8559cb81335f25b400
parent2d89cfaa91bcc36db415b5c07f1bd821398da96e (diff)
parent28f10f4783bd4365654191740069a7112be03d92 (diff)
downloaddexon-solidity-0582fcb93b2407379b5e4e4ce55c3f418e7ff433.tar
dexon-solidity-0582fcb93b2407379b5e4e4ce55c3f418e7ff433.tar.gz
dexon-solidity-0582fcb93b2407379b5e4e4ce55c3f418e7ff433.tar.bz2
dexon-solidity-0582fcb93b2407379b5e4e4ce55c3f418e7ff433.tar.lz
dexon-solidity-0582fcb93b2407379b5e4e4ce55c3f418e7ff433.tar.xz
dexon-solidity-0582fcb93b2407379b5e4e4ce55c3f418e7ff433.tar.zst
dexon-solidity-0582fcb93b2407379b5e4e4ce55c3f418e7ff433.zip
Merge pull request #2194 from ethereum/removeerrorlabel
Remove error label / invalid jump label.
-rw-r--r--docs/assembly.rst9
-rw-r--r--libsolidity/codegen/CompilerUtils.cpp19
-rw-r--r--libsolidity/codegen/CompilerUtils.h4
-rw-r--r--libsolidity/inlineasm/AsmCodeGen.cpp2
-rw-r--r--libsolidity/inlineasm/AsmScope.h1
-rw-r--r--libsolidity/inlineasm/AsmScopeFiller.cpp4
-rw-r--r--test/libsolidity/InlineAssembly.cpp2
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp15
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<string, string> {
- { "$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: <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:
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"(