summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-02-22 13:27:28 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-02-22 13:27:28 +0800
commite4d8415f346e7067c3f060649c577b947a249e51 (patch)
tree8af7cd07650aaac7a53cd5d560134c0990d82ba0 /src/hir
parenta4ec506e3f3c23c7818c3ce2d020b25966c420d8 (diff)
downloadmrust-e4d8415f346e7067c3f060649c577b947a249e51.tar.gz
MIR - add Param type for places where a lvalue is read
Diffstat (limited to 'src/hir')
-rw-r--r--src/hir/deserialise.cpp29
-rw-r--r--src/hir/serialise.cpp9
2 files changed, 29 insertions, 9 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp
index 19786eb1..fd6cbbf2 100644
--- a/src/hir/deserialise.cpp
+++ b/src/hir/deserialise.cpp
@@ -317,6 +317,16 @@ namespace {
::MIR::Terminator deserialise_mir_terminator();
::MIR::CallTarget deserialise_mir_calltarget();
+ ::MIR::Param deserialise_mir_param()
+ {
+ switch(auto tag = m_in.read_tag())
+ {
+ case ::MIR::Param::TAG_LValue: return deserialise_mir_lvalue();
+ case ::MIR::Param::TAG_Constant: return deserialise_mir_constant();
+ default:
+ throw ::std::runtime_error(FMT("Invalid MIR LValue tag - " << tag));
+ }
+ }
::MIR::LValue deserialise_mir_lvalue() {
::MIR::LValue rv;
TRACE_FUNCTION_FR("", rv);
@@ -361,7 +371,7 @@ namespace {
_(Use, deserialise_mir_lvalue() )
_(Constant, deserialise_mir_constant() )
_(SizedArray, {
- deserialise_mir_lvalue(),
+ deserialise_mir_param(),
static_cast<unsigned int>(m_in.read_u64c())
})
_(Borrow, {
@@ -374,9 +384,9 @@ namespace {
deserialise_type()
})
_(BinOp, {
- deserialise_mir_lvalue(),
+ deserialise_mir_param(),
static_cast< ::MIR::eBinOp>( m_in.read_tag() ),
- deserialise_mir_lvalue()
+ deserialise_mir_param()
})
_(UniOp, {
deserialise_mir_lvalue(),
@@ -390,23 +400,23 @@ namespace {
})
_(MakeDst, {
deserialise_mir_lvalue(),
- deserialise_mir_lvalue()
+ deserialise_mir_param()
})
_(Tuple, {
- deserialise_vec_c< ::MIR::LValue>([&](){ return deserialise_mir_lvalue(); })
+ deserialise_vec< ::MIR::Param>()
})
_(Array, {
- deserialise_vec_c< ::MIR::LValue>([&](){ return deserialise_mir_lvalue(); })
+ deserialise_vec< ::MIR::Param>()
})
_(Variant, {
deserialise_genericpath(),
static_cast<unsigned int>( m_in.read_count() ),
- deserialise_mir_lvalue()
+ deserialise_mir_param()
})
_(Struct, {
deserialise_genericpath(),
static_cast<unsigned int>( m_in.read_count() ),
- deserialise_vec_c< ::MIR::LValue>([&](){ return deserialise_mir_lvalue(); })
+ deserialise_vec< ::MIR::Param>()
})
#undef _
default:
@@ -642,6 +652,7 @@ namespace {
template<> DEF_D( ::HIR::AssociatedType, return d.deserialise_associatedtype(); )
template<> DEF_D( ::HIR::TraitValueItem, return d.deserialise_traitvalueitem(); )
+ template<> DEF_D( ::MIR::Param, return d.deserialise_mir_param(); )
template<> DEF_D( ::MIR::LValue, return d.deserialise_mir_lvalue(); )
template<> DEF_D( ::MIR::Statement, return d.deserialise_mir_statement(); )
template<> DEF_D( ::MIR::BasicBlock, return d.deserialise_mir_basicblock(); )
@@ -1017,7 +1028,7 @@ namespace {
static_cast<unsigned int>(m_in.read_count()),
deserialise_mir_lvalue(),
deserialise_mir_calltarget(),
- deserialise_vec< ::MIR::LValue>()
+ deserialise_vec< ::MIR::Param>()
})
#undef _
default:
diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp
index dede23a4..5a74e798 100644
--- a/src/hir/serialise.cpp
+++ b/src/hir/serialise.cpp
@@ -552,6 +552,15 @@ namespace {
)
)
}
+ void serialise(const ::MIR::Param& p)
+ {
+ TRACE_FUNCTION_F("Param = "<<p);
+ m_out.write_tag( static_cast<int>(p.tag()) );
+ TU_MATCHA( (p), (e),
+ (LValue, serialise(e);),
+ (Constant, serialise(e);)
+ )
+ }
void serialise(const ::MIR::LValue& lv)
{
TRACE_FUNCTION_F("LValue = "<<lv);