From ff4f1666ab913ae3b90bc0af1477c2042f5ad535 Mon Sep 17 00:00:00 2001 From: Lu Guanqun Date: Tue, 22 Dec 2015 16:50:24 +0000 Subject: [cond-expr] generate assembly for _ ? _ : _ --- libsolidity/codegen/ExpressionCompiler.cpp | 15 +++++++++++++++ libsolidity/codegen/ExpressionCompiler.h | 1 + 2 files changed, 16 insertions(+) (limited to 'libsolidity/codegen') diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 040217da..6dd9d005 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -176,6 +176,21 @@ void ExpressionCompiler::appendStateVariableAccessor(VariableDeclaration const& m_context.appendJump(eth::AssemblyItem::JumpType::OutOfFunction); } +bool ExpressionCompiler::visit(Conditional const& _condition) +{ + CompilerContext::LocationSetter locationSetter(m_context, _condition); + _condition.condition().accept(*this); + m_context << eth::Instruction::ISZERO; + eth::AssemblyItem falseTag = m_context.appendConditionalJump(); + _condition.trueExpression().accept(*this); + eth::AssemblyItem endTag = m_context.appendJumpToNew(); + m_context << falseTag; + m_context.adjustStackOffset(-1); + _condition.falseExpression().accept(*this); + m_context << endTag; + return false; +} + bool ExpressionCompiler::visit(Assignment const& _assignment) { CompilerContext::LocationSetter locationSetter(m_context, _assignment); diff --git a/libsolidity/codegen/ExpressionCompiler.h b/libsolidity/codegen/ExpressionCompiler.h index 379aa65a..f00b24e8 100644 --- a/libsolidity/codegen/ExpressionCompiler.h +++ b/libsolidity/codegen/ExpressionCompiler.h @@ -71,6 +71,7 @@ public: void appendConstStateVariableAccessor(const VariableDeclaration& _varDecl); private: + virtual bool visit(Conditional const& _condition) override; virtual bool visit(Assignment const& _assignment) override; virtual bool visit(TupleExpression const& _tuple) override; virtual bool visit(UnaryOperation const& _unaryOperation) override; -- cgit v1.2.3 From c781b130ef95c1ad841ab1b80fbc95d7c068db80 Mon Sep 17 00:00:00 2001 From: Lu Guanqun Date: Wed, 23 Dec 2015 16:09:29 +0000 Subject: [cond-expr] make the codegen one instruction less --- libsolidity/codegen/ExpressionCompiler.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'libsolidity/codegen') diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 6dd9d005..5e9c6920 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -180,13 +180,12 @@ bool ExpressionCompiler::visit(Conditional const& _condition) { CompilerContext::LocationSetter locationSetter(m_context, _condition); _condition.condition().accept(*this); - m_context << eth::Instruction::ISZERO; - eth::AssemblyItem falseTag = m_context.appendConditionalJump(); - _condition.trueExpression().accept(*this); + eth::AssemblyItem trueTag = m_context.appendConditionalJump(); + _condition.falseExpression().accept(*this); eth::AssemblyItem endTag = m_context.appendJumpToNew(); - m_context << falseTag; + m_context << trueTag; m_context.adjustStackOffset(-1); - _condition.falseExpression().accept(*this); + _condition.trueExpression().accept(*this); m_context << endTag; return false; } -- cgit v1.2.3 From b003290638e16e595c25e433f2f65648ea6644da Mon Sep 17 00:00:00 2001 From: Lu Guanqun Date: Thu, 7 Jan 2016 09:14:29 +0000 Subject: [cond-expr] fixup according to code review --- libsolidity/codegen/ExpressionCompiler.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libsolidity/codegen') diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 5e9c6920..9536c727 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -182,10 +182,12 @@ bool ExpressionCompiler::visit(Conditional const& _condition) _condition.condition().accept(*this); eth::AssemblyItem trueTag = m_context.appendConditionalJump(); _condition.falseExpression().accept(*this); + utils().convertType(*_condition.falseExpression().annotation().type, *_condition.annotation().type); eth::AssemblyItem endTag = m_context.appendJumpToNew(); m_context << trueTag; - m_context.adjustStackOffset(-1); + m_context.adjustStackOffset(-_condition.annotation().type->sizeOnStack()); _condition.trueExpression().accept(*this); + utils().convertType(*_condition.trueExpression().annotation().type, *_condition.annotation().type); m_context << endTag; return false; } -- cgit v1.2.3