mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Solidity ForStatement Compiler part
- Work in progress
This commit is contained in:
		
							parent
							
								
									adbea47596
								
							
						
					
					
						commit
						5c05b8d725
					
				
							
								
								
									
										5
									
								
								AST.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								AST.h
									
									
									
									
									
								
							| @ -529,6 +529,11 @@ public: | ||||
| 	virtual void accept(ASTConstVisitor& _visitor) const override; | ||||
| 	virtual void checkTypeRequirements() override; | ||||
| 
 | ||||
| 	Statement const* getInitializationExpression() const { return m_initExpression.get(); } | ||||
| 	Expression const* getCondition() const { return m_condExpression.get(); } | ||||
| 	ExpressionStatement const* getLoopExpression() const { return m_loopExpression.get(); } | ||||
| 	Statement const& getBody() const { return *m_body; } | ||||
| 
 | ||||
| private: | ||||
| 	/// For statement's initialization expresion. for(XXX; ; ). Can be empty
 | ||||
| 	ASTPointer<Statement> m_initExpression; | ||||
|  | ||||
							
								
								
									
										31
									
								
								Compiler.cpp
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								Compiler.cpp
									
									
									
									
									
								
							| @ -289,8 +289,35 @@ bool Compiler::visit(WhileStatement const& _whileStatement) | ||||
| 
 | ||||
| bool Compiler::visit(ForStatement const& _forStatement) | ||||
| { | ||||
| 	// LTODO
 | ||||
| 	(void) _forStatement; | ||||
| 	eth::AssemblyItem loopStart = m_context.newTag(); | ||||
| 	eth::AssemblyItem loopEnd = m_context.newTag(); | ||||
| 	m_continueTags.push_back(loopStart); | ||||
| 	m_breakTags.push_back(loopEnd); | ||||
| 
 | ||||
| 	if (_forStatement.getInitializationExpression()) | ||||
| 		_forStatement.getInitializationExpression()->accept(*this); | ||||
| 
 | ||||
| 	m_context << loopStart; | ||||
| 
 | ||||
| 	// if there is no terminating condition in for, default is to always be true
 | ||||
| 	if (_forStatement.getCondition()) | ||||
| 	{ | ||||
| 		compileExpression(*_forStatement.getCondition()); | ||||
| 		m_context << eth::Instruction::ISZERO; | ||||
| 		m_context.appendConditionalJumpTo(loopEnd); | ||||
| 	} | ||||
| 
 | ||||
| 	_forStatement.getBody().accept(*this); | ||||
| 
 | ||||
| 	// for's loop expression if existing
 | ||||
| 	if (_forStatement.getLoopExpression()) | ||||
| 		_forStatement.getLoopExpression()->accept(*this); | ||||
| 
 | ||||
| 	m_context.appendJumpTo(loopStart); | ||||
| 	m_context << loopEnd; | ||||
| 
 | ||||
| 	m_continueTags.pop_back(); | ||||
| 	m_breakTags.pop_back(); | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user