summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-05-07 15:55:51 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-05-07 15:55:51 +0800
commit592c816af31a534dde7274d2bd38661585a71ac7 (patch)
tree7eb175fb179d65ea7f413a87c871a81f3e8b6b72 /src/hir
parentec1dc3542bd5122db57f4459f63a6040f5e3ab20 (diff)
downloadmrust-592c816af31a534dde7274d2bd38661585a71ac7.tar.gz
HIR - Replace m_yeilds_final_value with a node
Diffstat (limited to 'src/hir')
-rw-r--r--src/hir/dump.cpp30
-rw-r--r--src/hir/expr.cpp2
-rw-r--r--src/hir/expr.hpp9
-rw-r--r--src/hir/from_ast_expr.cpp8
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: {