diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-05-07 15:55:51 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-05-07 15:55:51 +0800 |
commit | 592c816af31a534dde7274d2bd38661585a71ac7 (patch) | |
tree | 7eb175fb179d65ea7f413a87c871a81f3e8b6b72 /src/hir | |
parent | ec1dc3542bd5122db57f4459f63a6040f5e3ab20 (diff) | |
download | mrust-592c816af31a534dde7274d2bd38661585a71ac7.tar.gz |
HIR - Replace m_yeilds_final_value with a node
Diffstat (limited to 'src/hir')
-rw-r--r-- | src/hir/dump.cpp | 30 | ||||
-rw-r--r-- | src/hir/expr.cpp | 2 | ||||
-rw-r--r-- | src/hir/expr.hpp | 9 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 8 |
4 files changed, 27 insertions, 22 deletions
diff --git a/src/hir/dump.cpp b/src/hir/dump.cpp index 614e95eb..8bcffa4e 100644 --- a/src/hir/dump.cpp +++ b/src/hir/dump.cpp @@ -302,28 +302,28 @@ namespace { void visit(::HIR::ExprNode_Block& node) override { if( node.m_nodes.size() == 0 ) { - m_os << "{ }"; + m_os << "{"; + if( node.m_value_node ) + { + m_os << " "; + this->visit_node_ptr(node.m_value_node); + } + m_os << " }"; } - //else if( node.m_nodes.size() == 1) { - // m_os << "{ "; - // this->visit_node_ptr(node.m_nodes.front()); - // m_os << " }"; - //} else { m_os << "{\n"; inc_indent(); for(auto& sn : node.m_nodes) { + m_os << "\n"; m_os << indent(); this->visit_node_ptr(sn); - if( &sn != &node.m_nodes.back() ) { - m_os << ";\n"; - } - else if( !node.m_yields_final ) { - m_os << ";\n"; - } - else { - m_os << "\n"; - } + m_os << ";\n"; + } + if( node.m_value_node ) + { + m_os << indent(); + this->visit_node_ptr(node.m_value_node); + m_os << "\n"; } dec_indent(); m_os << indent() << "}"; diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp index e19e7df6..53f85c42 100644 --- a/src/hir/expr.cpp +++ b/src/hir/expr.cpp @@ -23,6 +23,8 @@ DEF_VISIT(ExprNode_Block, node, for(auto& subnode : node.m_nodes) { visit_node_ptr(subnode); } + if( node.m_value_node ) + visit_node_ptr(node.m_value_node); ) DEF_VISIT(ExprNode_Asm, node, for(auto& v : node.m_outputs) diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index 81e89b28..3c37a930 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -68,21 +68,20 @@ struct ExprNode_Block: { bool m_is_unsafe; ::std::vector< ExprNodeP > m_nodes; - bool m_yields_final; + ExprNodeP m_value_node; // can be null ::HIR::SimplePath m_local_mod; t_trait_list m_traits; ExprNode_Block(Span sp): ExprNode(mv$(sp)), - m_is_unsafe(false), - m_yields_final(false) + m_is_unsafe(false) {} - ExprNode_Block(Span sp, bool is_unsafe, ::std::vector<ExprNodeP> nodes): + ExprNode_Block(Span sp, bool is_unsafe, ::std::vector<ExprNodeP> nodes, ExprNodeP value_node): ExprNode( mv$(sp) ), m_is_unsafe(is_unsafe), m_nodes( mv$(nodes) ), - m_yields_final(false) + m_value_node( mv$(value_node) ) {} NODE_METHODS(); diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index d1d24f28..cd2b27fa 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -33,7 +33,11 @@ struct LowerHIR_ExprNode_Visitor: ASSERT_BUG(v.get_pos(), n, "NULL node encountered in block"); rv->m_nodes.push_back( LowerHIR_ExprNode_Inner( *n ) ); } - rv->m_yields_final = v.m_yields_final_value; + if( v.m_yields_final_value && ! rv->m_nodes.empty() ) + { + rv->m_value_node = mv$(rv->m_nodes.back()); + rv->m_nodes.pop_back(); + } if( v.m_local_mod ) { @@ -328,7 +332,7 @@ struct LowerHIR_ExprNode_Visitor: m_rv.reset( new ::HIR::ExprNode_Loop( v.span(), v.m_label, - ::HIR::ExprNodeP(new ::HIR::ExprNode_Block( v.span(), false, mv$(code))) + ::HIR::ExprNodeP(new ::HIR::ExprNode_Block( v.span(), false, mv$(code), {} )) ) ); break; } case ::AST::ExprNode_Loop::WHILELET: { |