mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
						commit
						a08d853bbb
					
				
							
								
								
									
										149
									
								
								libjulia/optimiser/ASTWalker.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								libjulia/optimiser/ASTWalker.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | ||||
| /*
 | ||||
| 	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/>.
 | ||||
| */ | ||||
| /**
 | ||||
|  * Generic AST walker. | ||||
|  */ | ||||
| 
 | ||||
| #include <libjulia/optimiser/ASTWalker.h> | ||||
| 
 | ||||
| #include <libsolidity/inlineasm/AsmData.h> | ||||
| 
 | ||||
| #include <libsolidity/interface/Exceptions.h> | ||||
| 
 | ||||
| #include <boost/range/adaptor/reversed.hpp> | ||||
| 
 | ||||
| using namespace std; | ||||
| using namespace dev; | ||||
| using namespace dev::julia; | ||||
| using namespace dev::solidity; | ||||
| 
 | ||||
| 
 | ||||
| void ASTWalker::operator()(FunctionalInstruction const& _instr) | ||||
| { | ||||
| 	walkVector(_instr.arguments | boost::adaptors::reversed); | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(FunctionCall const& _funCall) | ||||
| { | ||||
| 	walkVector(_funCall.arguments | boost::adaptors::reversed); | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(Assignment const& _assignment) | ||||
| { | ||||
| 	for (auto const& name: _assignment.variableNames) | ||||
| 		(*this)(name); | ||||
| 	boost::apply_visitor(*this, *_assignment.value); | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(VariableDeclaration const& _varDecl) | ||||
| { | ||||
| 	if (_varDecl.value) | ||||
| 		boost::apply_visitor(*this, *_varDecl.value); | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(If const& _if) | ||||
| { | ||||
| 	boost::apply_visitor(*this, *_if.condition); | ||||
| 	(*this)(_if.body); | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(Switch const& _switch) | ||||
| { | ||||
| 	boost::apply_visitor(*this, *_switch.expression); | ||||
| 	for (auto const& _case: _switch.cases) | ||||
| 	{ | ||||
| 		if (_case.value) | ||||
| 			(*this)(*_case.value); | ||||
| 		(*this)(_case.body); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(FunctionDefinition const& _fun) | ||||
| { | ||||
| 	(*this)(_fun.body); | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(ForLoop const& _for) | ||||
| { | ||||
| 	(*this)(_for.pre); | ||||
| 	boost::apply_visitor(*this, *_for.condition); | ||||
| 	(*this)(_for.post); | ||||
| 	(*this)(_for.body); | ||||
| } | ||||
| 
 | ||||
| void ASTWalker::operator()(Block const& _block) | ||||
| { | ||||
| 	walkVector(_block.statements); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(FunctionalInstruction& _instr) | ||||
| { | ||||
| 	walkVector(_instr.arguments | boost::adaptors::reversed); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(FunctionCall& _funCall) | ||||
| { | ||||
| 	walkVector(_funCall.arguments | boost::adaptors::reversed); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(Assignment& _assignment) | ||||
| { | ||||
| 	for (auto& name: _assignment.variableNames) | ||||
| 		(*this)(name); | ||||
| 	boost::apply_visitor(*this, *_assignment.value); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(VariableDeclaration& _varDecl) | ||||
| { | ||||
| 	if (_varDecl.value) | ||||
| 		boost::apply_visitor(*this, *_varDecl.value); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(If& _if) | ||||
| { | ||||
| 	boost::apply_visitor(*this, *_if.condition); | ||||
| 	(*this)(_if.body); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(Switch& _switch) | ||||
| { | ||||
| 	boost::apply_visitor(*this, *_switch.expression); | ||||
| 	for (auto& _case: _switch.cases) | ||||
| 	{ | ||||
| 		if (_case.value) | ||||
| 			(*this)(*_case.value); | ||||
| 		(*this)(_case.body); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(FunctionDefinition& _fun) | ||||
| { | ||||
| 	(*this)(_fun.body); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(ForLoop& _for) | ||||
| { | ||||
| 	(*this)(_for.pre); | ||||
| 	boost::apply_visitor(*this, *_for.condition); | ||||
| 	(*this)(_for.post); | ||||
| 	(*this)(_for.body); | ||||
| } | ||||
| 
 | ||||
| void ASTModifier::operator()(Block& _block) | ||||
| { | ||||
| 	walkVector(_block.statements); | ||||
| } | ||||
							
								
								
									
										100
									
								
								libjulia/optimiser/ASTWalker.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								libjulia/optimiser/ASTWalker.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | ||||
| /*
 | ||||
| 	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/>.
 | ||||
| */ | ||||
| /**
 | ||||
|  * Generic AST walker. | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <libjulia/ASTDataForward.h> | ||||
| 
 | ||||
| #include <libsolidity/interface/Exceptions.h> | ||||
| 
 | ||||
| #include <boost/variant.hpp> | ||||
| #include <boost/optional.hpp> | ||||
| 
 | ||||
| #include <vector> | ||||
| #include <set> | ||||
| #include <map> | ||||
| 
 | ||||
| namespace dev | ||||
| { | ||||
| namespace julia | ||||
| { | ||||
| 
 | ||||
| /**
 | ||||
|  * Generic AST walker. | ||||
|  */ | ||||
| class ASTWalker: public boost::static_visitor<> | ||||
| { | ||||
| public: | ||||
| 	virtual void operator()(Literal const&) {} | ||||
| 	virtual void operator()(Instruction const&) { solAssert(false, ""); } | ||||
| 	virtual void operator()(Identifier const&) {} | ||||
| 	virtual void operator()(FunctionalInstruction const& _instr); | ||||
| 	virtual void operator()(FunctionCall const& _funCall); | ||||
| 	virtual void operator()(Label const&) { solAssert(false, ""); } | ||||
| 	virtual void operator()(StackAssignment const&) { solAssert(false, ""); } | ||||
| 	virtual void operator()(Assignment const& _assignment); | ||||
| 	virtual void operator()(VariableDeclaration const& _varDecl); | ||||
| 	virtual void operator()(If const& _if); | ||||
| 	virtual void operator()(Switch const& _switch); | ||||
| 	virtual void operator()(FunctionDefinition const&); | ||||
| 	virtual void operator()(ForLoop const&); | ||||
| 	virtual void operator()(Block const& _block); | ||||
| 
 | ||||
| protected: | ||||
| 	template <class T> | ||||
| 	void walkVector(T const& _statements) | ||||
| 	{ | ||||
| 		for (auto const& st: _statements) | ||||
| 			boost::apply_visitor(*this, st); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Generic AST modifier (i.e. non-const version of ASTWalker). | ||||
|  */ | ||||
| class ASTModifier: public boost::static_visitor<> | ||||
| { | ||||
| public: | ||||
| 	virtual void operator()(Literal&) {} | ||||
| 	virtual void operator()(Instruction&) { solAssert(false, ""); } | ||||
| 	virtual void operator()(Identifier&) {} | ||||
| 	virtual void operator()(FunctionalInstruction& _instr); | ||||
| 	virtual void operator()(FunctionCall& _funCall); | ||||
| 	virtual void operator()(Label&) { solAssert(false, ""); } | ||||
| 	virtual void operator()(StackAssignment&) { solAssert(false, ""); } | ||||
| 	virtual void operator()(Assignment& _assignment); | ||||
| 	virtual void operator()(VariableDeclaration& _varDecl); | ||||
| 	virtual void operator()(If& _if); | ||||
| 	virtual void operator()(Switch& _switch); | ||||
| 	virtual void operator()(FunctionDefinition&); | ||||
| 	virtual void operator()(ForLoop&); | ||||
| 	virtual void operator()(Block& _block); | ||||
| 
 | ||||
| protected: | ||||
| 	template <class T> | ||||
| 	void walkVector(T&& _statements) | ||||
| 	{ | ||||
| 		for (auto& st: _statements) | ||||
| 			boost::apply_visitor(*this, st); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| } | ||||
| } | ||||
							
								
								
									
										44
									
								
								libjulia/optimiser/NameCollector.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								libjulia/optimiser/NameCollector.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| /*
 | ||||
| 	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/>.
 | ||||
| */ | ||||
| /**
 | ||||
|  * Specific AST walker that collects all defined names. | ||||
|  */ | ||||
| 
 | ||||
| #include <libjulia/optimiser/NameCollector.h> | ||||
| 
 | ||||
| #include <libsolidity/inlineasm/AsmData.h> | ||||
| 
 | ||||
| using namespace std; | ||||
| using namespace dev; | ||||
| using namespace dev::julia; | ||||
| 
 | ||||
| void NameCollector::operator()(VariableDeclaration const& _varDecl) | ||||
| { | ||||
| 	for (auto const& var: _varDecl.variables) | ||||
| 		m_names.insert(var.name); | ||||
| } | ||||
| 
 | ||||
| void NameCollector::operator ()(FunctionDefinition const& _funDef) | ||||
| { | ||||
| 	m_names.insert(_funDef.name); | ||||
| 	m_functions[_funDef.name] = &_funDef; | ||||
| 	for (auto const arg: _funDef.parameters) | ||||
| 		m_names.insert(arg.name); | ||||
| 	for (auto const ret: _funDef.returnVariables) | ||||
| 		m_names.insert(ret.name); | ||||
| 	ASTWalker::operator ()(_funDef); | ||||
| } | ||||
							
								
								
									
										52
									
								
								libjulia/optimiser/NameCollector.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								libjulia/optimiser/NameCollector.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| /*
 | ||||
| 	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/>.
 | ||||
| */ | ||||
| /**
 | ||||
|  * Specific AST walker that collects all defined names. | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <libjulia/optimiser/ASTWalker.h> | ||||
| 
 | ||||
| #include <string> | ||||
| #include <map> | ||||
| #include <set> | ||||
| 
 | ||||
| namespace dev | ||||
| { | ||||
| namespace julia | ||||
| { | ||||
| 
 | ||||
| /**
 | ||||
|  * Specific AST walker that collects all defined names. | ||||
|  */ | ||||
| class NameCollector: public ASTWalker | ||||
| { | ||||
| public: | ||||
| 	using ASTWalker::operator (); | ||||
| 	virtual void operator()(VariableDeclaration const& _varDecl) override; | ||||
| 	virtual void operator()(FunctionDefinition const& _funDef) override; | ||||
| 
 | ||||
| 	std::set<std::string> const& names() const { return m_names; } | ||||
| 	std::map<std::string, FunctionDefinition const*> const& functions() const { return m_functions; } | ||||
| private: | ||||
| 	std::set<std::string> m_names; | ||||
| 	std::map<std::string, FunctionDefinition const*> m_functions; | ||||
| }; | ||||
| 
 | ||||
| } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user