mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #3473 from ethereum/julia-main-func
Introduce Julia filter to encapsulate top level Block as a FunctionDefinition
This commit is contained in:
		
						commit
						87826a7d87
					
				
							
								
								
									
										55
									
								
								libjulia/optimiser/MainFunction.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								libjulia/optimiser/MainFunction.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| /*
 | ||||
| 	This file is part of solidity. | ||||
| 
 | ||||
| 	solidity is free software: you can redistribute it and/or modify | ||||
| 	it under the terms of the GNU General Public License as published by | ||||
| 	the Free Software Foundation, either version 3 of the License, or | ||||
| 	(at your option) any later version. | ||||
| 
 | ||||
| 	solidity is distributed in the hope that it will be useful, | ||||
| 	but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| 	GNU General Public License for more details. | ||||
| 
 | ||||
| 	You should have received a copy of the GNU General Public License | ||||
| 	along with solidity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /**
 | ||||
|  * Changes the topmost block to be a function with a specific name ("main") which has no | ||||
|  * inputs nor outputs. | ||||
|  */ | ||||
| 
 | ||||
| #include <libjulia/optimiser/MainFunction.h> | ||||
| 
 | ||||
| #include <libjulia/optimiser/NameCollector.h> | ||||
| 
 | ||||
| #include <libsolidity/inlineasm/AsmData.h> | ||||
| 
 | ||||
| #include <libsolidity/interface/Exceptions.h> | ||||
| 
 | ||||
| #include <libdevcore/CommonData.h> | ||||
| 
 | ||||
| using namespace std; | ||||
| using namespace dev; | ||||
| using namespace dev::julia; | ||||
| using namespace dev::solidity; | ||||
| 
 | ||||
| void MainFunction::operator()(Block& _block) | ||||
| { | ||||
| 	solAssert(_block.statements.size() >= 1, ""); | ||||
| 	solAssert(_block.statements[0].type() == typeid(Block), ""); | ||||
| 	for (size_t i = 1; i < _block.statements.size(); ++i) | ||||
| 		solAssert(_block.statements.at(i).type() == typeid(FunctionDefinition), ""); | ||||
| 	/// @todo this should handle scopes properly and instead of an assertion it should rename the conflicting function
 | ||||
| 	solAssert(NameCollector(_block).names().count("main") == 0, ""); | ||||
| 
 | ||||
| 	Block& block = boost::get<Block>(_block.statements[0]); | ||||
| 	FunctionDefinition main{ | ||||
| 		block.location, | ||||
| 		"main", | ||||
| 		{}, | ||||
| 		{}, | ||||
| 		std::move(block) | ||||
| 	}; | ||||
| 	_block.statements[0] = std::move(main); | ||||
| } | ||||
							
								
								
									
										41
									
								
								libjulia/optimiser/MainFunction.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								libjulia/optimiser/MainFunction.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| /*
 | ||||
| 	This file is part of solidity. | ||||
| 
 | ||||
| 	solidity is free software: you can redistribute it and/or modify | ||||
| 	it under the terms of the GNU General Public License as published by | ||||
| 	the Free Software Foundation, either version 3 of the License, or | ||||
| 	(at your option) any later version. | ||||
| 
 | ||||
| 	solidity is distributed in the hope that it will be useful, | ||||
| 	but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| 	GNU General Public License for more details. | ||||
| 
 | ||||
| 	You should have received a copy of the GNU General Public License | ||||
| 	along with solidity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /**
 | ||||
|  * Changes the topmost block to be a function with a specific name ("main") which has no | ||||
|  * inputs nor outputs. | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <libjulia/ASTDataForward.h> | ||||
| 
 | ||||
| namespace dev | ||||
| { | ||||
| namespace julia | ||||
| { | ||||
| 
 | ||||
| /**
 | ||||
|  * Prerequisites: Function Grouper | ||||
|  */ | ||||
| class MainFunction | ||||
| { | ||||
| public: | ||||
| 	void operator()(Block& _block); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
| } | ||||
| @ -87,3 +87,12 @@ simple rules like ``x + 0 == x`` to simplify expressions. | ||||
| ## Ineffective Statement Remover | ||||
| 
 | ||||
| This step removes statements that have no side-effects. | ||||
| 
 | ||||
| ## WebAssembly specific | ||||
| 
 | ||||
| ### Main Function | ||||
| 
 | ||||
| Changes the topmost block to be a function with a specific name ("main") which has no | ||||
| inputs nor outputs. | ||||
| 
 | ||||
| Depends on the Function Grouper. | ||||
|  | ||||
							
								
								
									
										87
									
								
								test/libjulia/MainFunction.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								test/libjulia/MainFunction.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | ||||
| /*
 | ||||
|     This file is part of solidity. | ||||
| 
 | ||||
|     solidity is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     solidity is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with solidity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /**
 | ||||
|  * @date 2018 | ||||
|  * Unit tests for the Julia MainFunction transformation. | ||||
|  */ | ||||
| 
 | ||||
| #include <test/libjulia/Common.h> | ||||
| 
 | ||||
| #include <libjulia/optimiser/FunctionGrouper.h> | ||||
| #include <libjulia/optimiser/MainFunction.h> | ||||
| 
 | ||||
| #include <libsolidity/inlineasm/AsmPrinter.h> | ||||
| 
 | ||||
| #include <boost/test/unit_test.hpp> | ||||
| 
 | ||||
| using namespace std; | ||||
| using namespace dev::julia; | ||||
| using namespace dev::julia::test; | ||||
| using namespace dev::solidity; | ||||
| 
 | ||||
| #define CHECK(_original, _expectation)\ | ||||
| do\ | ||||
| {\ | ||||
| 	assembly::AsmPrinter p(true);\ | ||||
| 	Block b = disambiguate(_original);\ | ||||
| 	(FunctionGrouper{})(b);\ | ||||
| 	(MainFunction{})(b);\ | ||||
| 	string result = p(b);\ | ||||
| 	BOOST_CHECK_EQUAL(result, format(_expectation));\ | ||||
| }\ | ||||
| while(false) | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE(JuliaMainFunction) | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(smoke_test) | ||||
| { | ||||
| 	CHECK("{ }", "{ function main() { } }"); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(single_fun) | ||||
| { | ||||
| 	CHECK( | ||||
| 		"{ let a:u256 function f() {} }", | ||||
| 		"{ function main() { let a:u256 } function f() {} }" | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(multi_fun_mixed) | ||||
| { | ||||
| 	CHECK( | ||||
| 		"{ let a:u256 function f() { let b:u256 } let c:u256 function g() { let d:u256 } let e:u256 }", | ||||
| 		"{ function main() { let a:u256 let c:u256 let e:u256 } function f() { let b:u256 } function g() { let d:u256 } }" | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(nested_fun) | ||||
| { | ||||
| 	CHECK( | ||||
| 		"{ let a:u256 function f() { let b:u256 function g() { let c:u256} let d:u256 } }", | ||||
| 		"{ function main() { let a:u256 } function f() { let b:u256 function g() { let c:u256} let d:u256 } }" | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(empty_block) | ||||
| { | ||||
| 	CHECK( | ||||
| 		"{ let a:u256 { } function f() -> x:bool { let b:u256 := 4:u256 {} for {} f() {} {} } }", | ||||
| 		"{ function main() { let a:u256 { } } function f() -> x:bool { let b:u256 := 4:u256 {} for {} f() {} {} } }" | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user