Merge pull request #1327 from ethereum/inline-assembly-errortag

ErrorTag in inline assembly
This commit is contained in:
Alex Beregszaszi 2016-11-15 11:17:33 +00:00 committed by GitHub
commit 0072160d77
5 changed files with 30 additions and 1 deletions

View File

@ -2,6 +2,7 @@
Features: Features:
* Do-while loops: support for a C-style do{<block>}while(<expr>); control structure * Do-while loops: support for a C-style do{<block>}while(<expr>); control structure
* Inline assembly: support ``invalidJumpLabel`` as a jump label.
* Type checker: now more eagerly searches for a common type of an inline array with mixed types * Type checker: now more eagerly searches for a common type of an inline array with mixed types
* Code generator: generates a runtime error when an out-of-range value is converted into an enum type. * Code generator: generates a runtime error when an out-of-range value is converted into an enum type.

View File

@ -716,6 +716,10 @@ will have a wrong impression about the stack height at label ``two``:
three: three:
} }
.. 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
---------------------------------- ----------------------------------

View File

@ -81,7 +81,11 @@ struct GeneratorState
class LabelOrganizer: public boost::static_visitor<> class LabelOrganizer: public boost::static_visitor<>
{ {
public: public:
LabelOrganizer(GeneratorState& _state): m_state(_state) {} LabelOrganizer(GeneratorState& _state): m_state(_state)
{
// Make the Solidity ErrorTag available to inline assembly
m_state.labels.insert(make_pair("invalidJumpLabel", m_state.assembly.errorTag()));
}
template <class T> template <class T>
void operator()(T const& /*_item*/) { } void operator()(T const& /*_item*/) { }

View File

@ -177,6 +177,11 @@ BOOST_AUTO_TEST_CASE(imbalanced_stack)
BOOST_CHECK(successAssemble("{ let x := 4 7 add }", false)); BOOST_CHECK(successAssemble("{ let x := 4 7 add }", false));
} }
BOOST_AUTO_TEST_CASE(error_tag)
{
BOOST_CHECK(successAssemble("{ invalidJumpLabel }"));
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
} }

View File

@ -7692,6 +7692,21 @@ 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_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
} }