mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	process some of the feedback
This commit is contained in:
		
							parent
							
								
									5fd6b206a9
								
							
						
					
					
						commit
						4581139afa
					
				| @ -88,15 +88,16 @@ public: | ||||
| 		}.printErrorInformation(_errors); | ||||
| 	} | ||||
| 
 | ||||
| 	shared_ptr<Object> getSubObject(shared_ptr<Object> const& _object, string const& _qualifiedPath) | ||||
| 	/// Recursively searches for an object at @param _qualifiedPath within @param _object.
 | ||||
| 	/// @returns the object at @param qualifiedPath or a nullptr if it was not found.
 | ||||
| 	shared_ptr<Object> getObject(shared_ptr<Object> const& _object, string const& _qualifiedPath) | ||||
| 	{ | ||||
| 		if (_qualifiedPath.empty() || _qualifiedPath == _object->name.str()) | ||||
| 			return _object; | ||||
| 
 | ||||
| 		yulAssert( | ||||
| 			boost::algorithm::starts_with(_qualifiedPath, _object->name.str() + "."), | ||||
| 			"Assembly object not found." | ||||
| 		); | ||||
| 		if (!boost::algorithm::starts_with(_qualifiedPath, _object->name.str() + ".")) { | ||||
| 			return nullptr; | ||||
| 		} | ||||
| 
 | ||||
| 		string const subObjectPath = _qualifiedPath.substr(_object->name.str().length() + 1); | ||||
| 		string const subObjectName = subObjectPath.substr(0, subObjectPath.find_first_of('.')); | ||||
| @ -106,19 +107,18 @@ public: | ||||
| 			[&subObjectName](auto const& _subObject) { return _subObject->name.str() == subObjectName; } | ||||
| 		); | ||||
| 
 | ||||
| 		yulAssert( | ||||
| 			subObjectIt != _object->subObjects.end(), | ||||
| 			"Assembly object not found." | ||||
| 		); | ||||
| 		if (subObjectIt == _object->subObjects.end()) { | ||||
| 			return nullptr; | ||||
| 		} | ||||
| 
 | ||||
| 		auto subObject = dynamic_pointer_cast<Object>(*subObjectIt); | ||||
| 
 | ||||
| 		yulAssert( | ||||
| 			subObject != nullptr, | ||||
| 			"Assembly object may not contain code." | ||||
| 			"Assembly object does not contain code." | ||||
| 		); | ||||
| 
 | ||||
| 		return getSubObject(subObject, subObjectPath); | ||||
| 		return getObject(subObject, subObjectPath); | ||||
| 	} | ||||
| 
 | ||||
| 	void parse(string const& _input, string const& _objectPath) | ||||
| @ -133,8 +133,8 @@ public: | ||||
| 
 | ||||
| 			auto scanner = make_shared<Scanner>(charStream); | ||||
| 
 | ||||
| 			if (!m_inputWasCodeBlock && scanner->currentToken() == Token::LBrace) | ||||
| 				m_inputWasCodeBlock = true; | ||||
| 			if (!m_inputIsCodeBlock && scanner->currentToken() == Token::LBrace) | ||||
| 				m_inputIsCodeBlock = true; | ||||
| 
 | ||||
| 			shared_ptr<Object> object = parser.parse(scanner, false); | ||||
| 
 | ||||
| @ -145,7 +145,12 @@ public: | ||||
| 				throw runtime_error("Could not parse source."); | ||||
| 			} | ||||
| 
 | ||||
| 			m_object = getSubObject(object, _objectPath); | ||||
| 			m_object = getObject(object, _objectPath); | ||||
| 
 | ||||
| 			if (m_object == nullptr) { | ||||
| 				throw runtime_error("Assembly object not found."); | ||||
| 			} | ||||
| 
 | ||||
| 			runCodeAnalyzer(errorReporter); | ||||
| 		} | ||||
| 		catch(...) | ||||
| @ -205,22 +210,22 @@ public: | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void applyFunctionToObject(shared_ptr<Object> _object, function<void(Object&)> _function) | ||||
| 	void applyFunctionToObjectAndSubobjects(Object& _object, function<void(Object&)> _function) | ||||
| 	{ | ||||
| 		for (auto const& subObjectNode: _object->subObjects) { | ||||
| 		for (auto const& subObjectNode: _object.subObjects) { | ||||
| 			auto subObject = dynamic_pointer_cast<Object>(subObjectNode); | ||||
| 
 | ||||
| 			if (subObject != nullptr) | ||||
| 				applyFunctionToObject(subObject, _function); | ||||
| 				applyFunctionToObjectAndSubobjects(*subObject, _function); | ||||
| 		} | ||||
| 
 | ||||
| 		_function(*_object); | ||||
| 		_function(_object); | ||||
| 	} | ||||
| 
 | ||||
| 	void runCodeAnalyzer(ErrorReporter& _errorReporter) | ||||
| 	{ | ||||
| 		applyFunctionToObject( | ||||
| 			m_object, | ||||
| 		applyFunctionToObjectAndSubobjects( | ||||
| 			*m_object, | ||||
| 			[&](Object& _object) | ||||
| 			{ | ||||
| 				_object.analysisInfo = make_shared<yul::AsmAnalysisInfo>(); | ||||
| @ -241,8 +246,8 @@ public: | ||||
| 
 | ||||
| 	void runCodeDisambiguator() | ||||
| 	{ | ||||
| 		applyFunctionToObject( | ||||
| 			m_object, | ||||
| 		applyFunctionToObjectAndSubobjects( | ||||
| 			*m_object, | ||||
| 			[&](Object& _object) | ||||
| 			{ | ||||
| 				_object.code = make_shared<yul::Block>( | ||||
| @ -256,8 +261,8 @@ public: | ||||
| 
 | ||||
| 	void runSequence(string_view _steps) | ||||
| 	{ | ||||
| 		applyFunctionToObject( | ||||
| 			m_object, | ||||
| 		applyFunctionToObjectAndSubobjects( | ||||
| 			*m_object, | ||||
| 			[&](Object& _object) | ||||
| 			{ | ||||
| 				OptimiserSuite{*m_context}.runSequence(_steps, *_object.code); | ||||
| @ -267,8 +272,8 @@ public: | ||||
| 
 | ||||
| 	void runVarNameCleaner() | ||||
| 	{ | ||||
| 		applyFunctionToObject( | ||||
| 			m_object, | ||||
| 		applyFunctionToObjectAndSubobjects( | ||||
| 			*m_object, | ||||
| 			[&](Object& _object) | ||||
| 			{ | ||||
| 				VarNameCleaner::run(*m_context, *_object.code); | ||||
| @ -278,8 +283,8 @@ public: | ||||
| 
 | ||||
| 	void runStackCompressor() | ||||
| 	{ | ||||
| 		applyFunctionToObject( | ||||
| 			m_object, | ||||
| 		applyFunctionToObjectAndSubobjects( | ||||
| 			*m_object, | ||||
| 			[&](Object& _object) | ||||
| 			{ | ||||
| 				StackCompressor::run(m_dialect, _object, true, 16); | ||||
| @ -287,18 +292,12 @@ public: | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	void parseAndPrint(string _source, string _objectPath) | ||||
| 	{ | ||||
| 		parse(_source, _objectPath); | ||||
| 		printObject(); | ||||
| 	} | ||||
| 
 | ||||
| 	void printObject() | ||||
| 	{ | ||||
| 		if (!m_inputWasCodeBlock) | ||||
| 		if (!m_inputIsCodeBlock) | ||||
| 			cout << m_object->toString(&m_dialect) << endl; | ||||
| 		else | ||||
| 			cout << AsmPrinter{m_dialect}(*m_object->code)  << endl; | ||||
| 			cout << AsmPrinter{m_dialect}(*m_object->code) << endl; | ||||
| 	} | ||||
| 
 | ||||
| 	void resetNameDispenser() | ||||
| @ -318,7 +317,7 @@ public: | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	void runSteps(string _source, string _objectPath, string _steps) | ||||
| 	void parseAndRunSteps(string const& _source, string const& _objectPath, string const& _steps) | ||||
| 	{ | ||||
| 		parse(_source, _objectPath); | ||||
| 		runCodeDisambiguator(); | ||||
| @ -384,7 +383,7 @@ public: | ||||
| 
 | ||||
| private: | ||||
| 	shared_ptr<yul::Object> m_object; | ||||
| 	bool m_inputWasCodeBlock = false; | ||||
| 	bool m_inputIsCodeBlock = false; | ||||
| 
 | ||||
| 	Dialect const& m_dialect{EVMDialect::strictAssemblyForEVMObjects(EVMVersion{})}; | ||||
| 	set<YulString> const m_reservedIdentifiers = {}; | ||||
| @ -410,11 +409,10 @@ int main(int argc, char** argv) | ||||
| 		po::options_description options( | ||||
| 			R"(yulopti, yul optimizer exploration tool. | ||||
| 	Usage: yulopti [Options] <file> | ||||
| 	Reads <file> containing a yul object and applies optimizer steps to it, | ||||
| 	Reads <file> containing a either a yul object or a yul code block and applies optimizer steps to it, | ||||
| 	interactively read from stdin. | ||||
| 	In non-interactive mode a list of steps has to be provided. | ||||
| 	If <file> is -, yul code is read from stdin and run non-interactively. | ||||
| 	An <object> flag may be provided, specifying a dotted path to an object in the input. | ||||
| 
 | ||||
| 	Allowed options)", | ||||
| 			po::options_description::m_default_line_length, | ||||
| @ -432,8 +430,10 @@ int main(int argc, char** argv) | ||||
| 			) | ||||
| 			( | ||||
| 				"object", | ||||
| 				po::value<string>(), | ||||
| 				"path to a yul object in the input" | ||||
| 				po::value<string>()->value_name("path"), | ||||
| 				"Dotted path to a specific Yul object in the source. " | ||||
| 				"If not specified, the top-level object is used. " | ||||
| 				"Only valid if the source actually contains objects (rather than a block of Yul code)." | ||||
| 			) | ||||
| 			( | ||||
| 				"non-interactive,n", | ||||
| @ -491,14 +491,17 @@ int main(int argc, char** argv) | ||||
| 		bool disambiguated = false; | ||||
| 
 | ||||
| 		if (!nonInteractive) | ||||
| 			yulOpti.parseAndPrint(input, objectPath); | ||||
| 		{ | ||||
| 			yulOpti.parse(input, objectPath); | ||||
| 			yulOpti.printObject(); | ||||
| 		} | ||||
| 
 | ||||
| 		if (arguments.count("steps")) | ||||
| 		{ | ||||
| 			string sequence = arguments["steps"].as<string>(); | ||||
| 			if (!nonInteractive) | ||||
| 				cout << "----------------------" << endl; | ||||
| 			yulOpti.runSteps(input, objectPath, sequence); | ||||
| 			yulOpti.parseAndRunSteps(input, objectPath, sequence); | ||||
| 			disambiguated = true; | ||||
| 		} | ||||
| 		if (!nonInteractive) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user