mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #1327 from ethereum/inline-assembly-errortag
ErrorTag in inline assembly
This commit is contained in:
commit
0072160d77
@ -2,6 +2,7 @@
|
||||
|
||||
Features:
|
||||
* 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
|
||||
* Code generator: generates a runtime error when an out-of-range value is converted into an enum type.
|
||||
|
||||
|
@ -716,6 +716,10 @@ will have a wrong impression about the stack height at label ``two``:
|
||||
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
|
||||
----------------------------------
|
||||
|
@ -81,7 +81,11 @@ struct GeneratorState
|
||||
class LabelOrganizer: public boost::static_visitor<>
|
||||
{
|
||||
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>
|
||||
void operator()(T const& /*_item*/) { }
|
||||
|
@ -177,6 +177,11 @@ BOOST_AUTO_TEST_CASE(imbalanced_stack)
|
||||
BOOST_CHECK(successAssemble("{ let x := 4 7 add }", false));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(error_tag)
|
||||
{
|
||||
BOOST_CHECK(successAssemble("{ invalidJumpLabel }"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
|
@ -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_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()
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user