diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-02-22 13:27:28 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-02-22 13:27:28 +0800 |
commit | e4d8415f346e7067c3f060649c577b947a249e51 (patch) | |
tree | 8af7cd07650aaac7a53cd5d560134c0990d82ba0 /src/hir | |
parent | a4ec506e3f3c23c7818c3ce2d020b25966c420d8 (diff) | |
download | mrust-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.cpp | 29 | ||||
-rw-r--r-- | src/hir/serialise.cpp | 9 |
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); |