mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Use function debug data.
This commit is contained in:
		
							parent
							
								
									e6f0fe8ae3
								
							
						
					
					
						commit
						2741175507
					
				| @ -38,6 +38,7 @@ | ||||
| 
 | ||||
| #include <fstream> | ||||
| #include <range/v3/algorithm/any_of.hpp> | ||||
| #include <range/v3/view/enumerate.hpp> | ||||
| 
 | ||||
| using namespace std; | ||||
| using namespace solidity; | ||||
| @ -761,8 +762,16 @@ LinkerObject const& Assembly::assemble() const | ||||
| 	for (auto const& [name, tagInfo]: m_namedTags) | ||||
| 	{ | ||||
| 		size_t position = m_tagPositionsInBytecode.at(tagInfo.id); | ||||
| 		optional<size_t> tagIndex; | ||||
| 		for (auto&& [index, item]: m_items | ranges::views::enumerate) | ||||
| 			if (item.type() == Tag && static_cast<size_t>(item.data()) == tagInfo.id) | ||||
| 			{ | ||||
| 				tagIndex = index; | ||||
| 				break; | ||||
| 			} | ||||
| 		ret.functionDebugData[name] = { | ||||
| 			position == numeric_limits<size_t>::max() ? nullopt : optional<size_t>{position}, | ||||
| 			tagIndex, | ||||
| 			tagInfo.sourceID, | ||||
| 			tagInfo.params, | ||||
| 			tagInfo.returns | ||||
|  | ||||
| @ -48,6 +48,7 @@ struct LinkerObject | ||||
| 	struct FunctionDebugData | ||||
| 	{ | ||||
| 		std::optional<size_t> bytecodeOffset; | ||||
| 		std::optional<size_t> instructionIndex; | ||||
| 		std::optional<size_t> sourceID; | ||||
| 		size_t params = {}; | ||||
| 		size_t returns = {}; | ||||
|  | ||||
| @ -1054,16 +1054,10 @@ size_t CompilerStack::functionEntryPoint( | ||||
| 	if (m_stackState != CompilationSuccessful) | ||||
| 		BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Compilation was not successful.")); | ||||
| 
 | ||||
| 	shared_ptr<Compiler> const& compiler = contract(_contractName).compiler; | ||||
| 	if (!compiler) | ||||
| 		return 0; | ||||
| 	evmasm::AssemblyItem tag = compiler->functionEntryLabel(_function); | ||||
| 	if (tag.type() == evmasm::UndefinedItem) | ||||
| 		return 0; | ||||
| 	evmasm::AssemblyItems const& items = compiler->runtimeAssembly().items(); | ||||
| 	for (size_t i = 0; i < items.size(); ++i) | ||||
| 		if (items.at(i).type() == evmasm::Tag && items.at(i).data() == tag.data()) | ||||
| 			return i; | ||||
| 	for (auto&& [name, data]: contract(_contractName).runtimeObject.functionDebugData) | ||||
| 		if (data.sourceID == _function.id()) | ||||
| 			if (data.instructionIndex) | ||||
| 				return *data.instructionIndex; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user