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