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:
|
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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
@ -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*/) { }
|
||||||
|
@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user