mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Unified dialect selection in libyul/SyntaxTest and YulOptimizerTest.
This commit is contained in:
		
							parent
							
								
									bb38ce1759
								
							
						
					
					
						commit
						a5ae51fa6e
					
				| @ -31,6 +31,7 @@ | |||||||
| #include <libyul/AsmPrinter.h> | #include <libyul/AsmPrinter.h> | ||||||
| #include <libyul/AssemblyStack.h> | #include <libyul/AssemblyStack.h> | ||||||
| #include <libyul/backends/evm/EVMDialect.h> | #include <libyul/backends/evm/EVMDialect.h> | ||||||
|  | #include <libyul/backends/wasm/WasmDialect.h> | ||||||
| 
 | 
 | ||||||
| #include <liblangutil/Scanner.h> | #include <liblangutil/Scanner.h> | ||||||
| #include <liblangutil/ErrorReporter.h> | #include <liblangutil/ErrorReporter.h> | ||||||
| @ -106,3 +107,51 @@ string yul::test::format(string const& _source, bool _yul) | |||||||
| { | { | ||||||
| 	return yul::AsmPrinter()(*parse(_source, _yul).first); | 	return yul::AsmPrinter()(*parse(_source, _yul).first); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  | std::map<string const, yul::Dialect const& (*)(langutil::EVMVersion)> const validDialects = { | ||||||
|  | 	{ | ||||||
|  | 		"evm", | ||||||
|  | 		[](langutil::EVMVersion _evmVersion) -> yul::Dialect const& | ||||||
|  | 		{ return yul::EVMDialect::strictAssemblyForEVMObjects(_evmVersion); } | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		"evmTyped", | ||||||
|  | 		[](langutil::EVMVersion _evmVersion) -> yul::Dialect const& | ||||||
|  | 		{ return yul::EVMDialectTyped::instance(_evmVersion); } | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		"yul", | ||||||
|  | 		[](langutil::EVMVersion) -> yul::Dialect const& | ||||||
|  | 		{ return yul::Dialect::yulDeprecated(); } | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		"ewasm", | ||||||
|  | 		[](langutil::EVMVersion) -> yul::Dialect const& | ||||||
|  | 		{ return yul::WasmDialect::instance(); } | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | vector<string> validDialectNames() | ||||||
|  | { | ||||||
|  | 	vector<string> names{size(validDialects), ""}; | ||||||
|  | 	transform(begin(validDialects), end(validDialects), names.begin(), [](auto const& dialect) { return dialect.first; }); | ||||||
|  | 
 | ||||||
|  | 	return names; | ||||||
|  | } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | yul::Dialect const& yul::test::dialect(std::string const& _name, langutil::EVMVersion _evmVersion) | ||||||
|  | { | ||||||
|  | 	if (!validDialects.count(_name)) | ||||||
|  | 		BOOST_THROW_EXCEPTION(runtime_error{ | ||||||
|  | 			"Invalid Dialect \"" + | ||||||
|  | 			_name + | ||||||
|  | 			"\". Valid dialects are " + | ||||||
|  | 			util::joinHumanReadable(validDialectNames(), ", ", " and ") + | ||||||
|  | 			"." | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 	return validDialects.at(_name)(_evmVersion); | ||||||
|  | } | ||||||
|  | |||||||
| @ -23,6 +23,8 @@ | |||||||
| 
 | 
 | ||||||
| #include <libyul/AsmData.h> | #include <libyul/AsmData.h> | ||||||
| 
 | 
 | ||||||
|  | #include <liblangutil/EVMVersion.h> | ||||||
|  | 
 | ||||||
| #include <string> | #include <string> | ||||||
| #include <vector> | #include <vector> | ||||||
| #include <memory> | #include <memory> | ||||||
| @ -53,4 +55,6 @@ parse(std::string const& _source, Dialect const& _dialect, langutil::ErrorList& | |||||||
| Block disambiguate(std::string const& _source, bool _yul = true); | Block disambiguate(std::string const& _source, bool _yul = true); | ||||||
| std::string format(std::string const& _source, bool _yul = true); | std::string format(std::string const& _source, bool _yul = true); | ||||||
| 
 | 
 | ||||||
|  | solidity::yul::Dialect const& dialect(std::string const& _name, langutil::EVMVersion _evmVersion); | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -19,59 +19,22 @@ | |||||||
| #include <libyul/AsmAnalysisInfo.h> | #include <libyul/AsmAnalysisInfo.h> | ||||||
| #include <libyul/AsmParser.h> | #include <libyul/AsmParser.h> | ||||||
| 
 | 
 | ||||||
| #include <libyul/backends/wasm/WasmDialect.h> |  | ||||||
| #include <libyul/backends/evm/EVMDialect.h> |  | ||||||
| #include <libyul/backends/wasm/WasmDialect.h> |  | ||||||
| 
 |  | ||||||
| #include <liblangutil/EVMVersion.h> | #include <liblangutil/EVMVersion.h> | ||||||
| #include <liblangutil/Exceptions.h> | #include <liblangutil/Exceptions.h> | ||||||
| 
 | 
 | ||||||
|  | #include <test/libyul/Common.h> | ||||||
| #include <test/libyul/SyntaxTest.h> | #include <test/libyul/SyntaxTest.h> | ||||||
| 
 | 
 | ||||||
|  | #include <test/Common.h> | ||||||
|  | 
 | ||||||
| using namespace std; | using namespace std; | ||||||
| using namespace solidity; | using namespace solidity; | ||||||
| using namespace solidity::util; | using namespace solidity::util; | ||||||
| using namespace solidity::langutil; | using namespace solidity::langutil; | ||||||
| using namespace solidity::yul::test; | using namespace solidity::yul::test; | ||||||
| 
 | 
 | ||||||
| namespace |  | ||||||
| { |  | ||||||
| std::map<string const, yul::Dialect const& (*)(langutil::EVMVersion)> const validDialects = { |  | ||||||
| 	{ |  | ||||||
| 		"evm", |  | ||||||
| 		[](langutil::EVMVersion _evmVersion) -> yul::Dialect const& |  | ||||||
| 		{ return yul::EVMDialect::strictAssemblyForEVM(_evmVersion); } |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 		"evmTyped", |  | ||||||
| 		[](langutil::EVMVersion _evmVersion) -> yul::Dialect const& |  | ||||||
| 		{ return yul::EVMDialectTyped::instance(_evmVersion); } |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 		"yul", |  | ||||||
| 		[](langutil::EVMVersion) -> yul::Dialect const& |  | ||||||
| 		{ return yul::Dialect::yulDeprecated(); } |  | ||||||
| 	}, |  | ||||||
| 	{ |  | ||||||
| 		"ewasm", |  | ||||||
| 		[](langutil::EVMVersion) -> yul::Dialect const& |  | ||||||
| 		{ return yul::WasmDialect::instance(); } |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| vector<string> validDialectNames() |  | ||||||
| { |  | ||||||
| 	vector<string> names{size(validDialects), ""}; |  | ||||||
| 	transform(begin(validDialects), end(validDialects), names.begin(), [](auto const& dialect) { return dialect.first; }); |  | ||||||
| 
 |  | ||||||
| 	return names; |  | ||||||
| } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void SyntaxTest::parseAndAnalyze() | void SyntaxTest::parseAndAnalyze() | ||||||
| { | { | ||||||
| 	yul::Dialect const& dialect = validDialects.at(m_dialectName)(m_evmVersion); |  | ||||||
| 
 |  | ||||||
| 	if (m_sources.size() != 1) | 	if (m_sources.size() != 1) | ||||||
| 		BOOST_THROW_EXCEPTION(runtime_error{"Expected only one source for yul test."}); | 		BOOST_THROW_EXCEPTION(runtime_error{"Expected only one source for yul test."}); | ||||||
| 
 | 
 | ||||||
| @ -82,12 +45,12 @@ void SyntaxTest::parseAndAnalyze() | |||||||
| 	ErrorReporter errorReporter{errorList}; | 	ErrorReporter errorReporter{errorList}; | ||||||
| 
 | 
 | ||||||
| 	auto scanner = make_shared<Scanner>(CharStream(source, name)); | 	auto scanner = make_shared<Scanner>(CharStream(source, name)); | ||||||
| 	auto parserResult = yul::Parser(errorReporter, dialect).parse(scanner, false); | 	auto parserResult = yul::Parser(errorReporter, *m_dialect).parse(scanner, false); | ||||||
| 
 | 
 | ||||||
| 	if (parserResult) | 	if (parserResult) | ||||||
| 	{ | 	{ | ||||||
| 		yul::AsmAnalysisInfo analysisInfo; | 		yul::AsmAnalysisInfo analysisInfo; | ||||||
| 		yul::AsmAnalyzer(analysisInfo, errorReporter, dialect).analyze(*parserResult); | 		yul::AsmAnalyzer(analysisInfo, errorReporter, *m_dialect).analyze(*parserResult); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (auto const& error: errorList) | 	for (auto const& error: errorList) | ||||||
| @ -115,14 +78,6 @@ void SyntaxTest::parseAndAnalyze() | |||||||
| SyntaxTest::SyntaxTest(string const& _filename, langutil::EVMVersion _evmVersion): | SyntaxTest::SyntaxTest(string const& _filename, langutil::EVMVersion _evmVersion): | ||||||
| 	CommonSyntaxTest(_filename, _evmVersion) | 	CommonSyntaxTest(_filename, _evmVersion) | ||||||
| { | { | ||||||
| 	m_dialectName = m_reader.stringSetting("dialect", "evmTyped"); | 	string dialectName = m_reader.stringSetting("dialect", "evmTyped"); | ||||||
| 
 | 	m_dialect = &dialect(dialectName, solidity::test::CommonOptions::get().evmVersion()); | ||||||
| 	if (!validDialects.count(m_dialectName)) |  | ||||||
| 		BOOST_THROW_EXCEPTION(runtime_error{ |  | ||||||
| 			"Invalid Dialect \"" + |  | ||||||
| 			m_dialectName + |  | ||||||
| 			"\". Valid dialects are " + |  | ||||||
| 			joinHumanReadable(validDialectNames(), ", ", " and ") + |  | ||||||
| 			"." |  | ||||||
| 		}); |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -42,7 +42,7 @@ protected: | |||||||
| 	void parseAndAnalyze() override; | 	void parseAndAnalyze() override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	std::string m_dialectName; | 	Dialect const* m_dialect = nullptr; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -101,16 +101,7 @@ YulOptimizerTest::YulOptimizerTest(string const& _filename): | |||||||
| 	m_source = m_reader.source(); | 	m_source = m_reader.source(); | ||||||
| 
 | 
 | ||||||
| 	auto dialectName = m_reader.stringSetting("dialect", "evm"); | 	auto dialectName = m_reader.stringSetting("dialect", "evm"); | ||||||
| 	if (dialectName == "yul") | 	m_dialect = &dialect(dialectName, solidity::test::CommonOptions::get().evmVersion()); | ||||||
| 		m_dialect = &Dialect::yulDeprecated(); |  | ||||||
| 	else if (dialectName == "ewasm") |  | ||||||
| 		m_dialect = &WasmDialect::instance(); |  | ||||||
| 	else if (dialectName == "evm") |  | ||||||
| 		m_dialect = &EVMDialect::strictAssemblyForEVMObjects(solidity::test::CommonOptions::get().evmVersion()); |  | ||||||
| 	else if (dialectName == "evmTyped") |  | ||||||
| 		m_dialect = &EVMDialectTyped::instance(solidity::test::CommonOptions::get().evmVersion()); |  | ||||||
| 	else |  | ||||||
| 		BOOST_THROW_EXCEPTION(runtime_error("Invalid dialect " + dialectName)); |  | ||||||
| 
 | 
 | ||||||
| 	m_step = m_reader.stringSetting("step", ""); | 	m_step = m_reader.stringSetting("step", ""); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user