summaryrefslogtreecommitdiff
path: root/src/mir/mir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mir/mir.cpp')
-rw-r--r--src/mir/mir.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/mir/mir.cpp b/src/mir/mir.cpp
index d5aae815..b696a7f0 100644
--- a/src/mir/mir.cpp
+++ b/src/mir/mir.cpp
@@ -328,4 +328,77 @@ namespace MIR {
throw "";
}
+::MIR::RValue MIR::RValue::clone() const
+{
+ TU_MATCHA( (*this), (e),
+ (Use,
+ return ::MIR::RValue(e.clone());
+ ),
+ (Constant,
+ TU_MATCHA( (e), (e2),
+ (Int, return ::MIR::Constant(e2); ),
+ (Uint, return ::MIR::Constant(e2); ),
+ (Float, return ::MIR::Constant(e2); ),
+ (Bool, return ::MIR::Constant(e2); ),
+ (Bytes, return ::MIR::Constant(e2); ),
+ (StaticString, return ::MIR::Constant(e2); ),
+ (Const, return ::MIR::Constant::make_Const({e2.p.clone()}); ),
+ (ItemAddr, return ::MIR::Constant(e2.clone()); )
+ )
+ ),
+ (SizedArray,
+ return ::MIR::RValue::make_SizedArray({ e.val.clone(), e.count });
+ ),
+ (Borrow,
+ return ::MIR::RValue::make_Borrow({ e.region, e.type, e.val.clone() });
+ ),
+ (Cast,
+ return ::MIR::RValue::make_Cast({ e.val.clone(), e.type.clone() });
+ ),
+ (BinOp,
+ return ::MIR::RValue::make_BinOp({ e.val_l.clone(), e.op, e.val_r.clone() });
+ ),
+ (UniOp,
+ return ::MIR::RValue::make_UniOp({ e.val.clone(), e.op });
+ ),
+ (DstMeta,
+ return ::MIR::RValue::make_DstMeta({ e.val.clone() });
+ ),
+ (DstPtr,
+ return ::MIR::RValue::make_DstPtr({ e.val.clone() });
+ ),
+ // Construct a DST pointer from a thin pointer and metadata
+ (MakeDst,
+ return ::MIR::RValue::make_MakeDst({ e.ptr_val.clone(), e.meta_val.clone() });
+ ),
+ (Tuple,
+ ::std::vector<::MIR::LValue> ret;
+ ret.reserve(e.vals.size());
+ for(const auto& v : e.vals)
+ ret.push_back( v.clone() );
+ return ::MIR::RValue::make_Tuple({ mv$(ret) });
+ ),
+ // Array literal
+ (Array,
+ ::std::vector<::MIR::LValue> ret;
+ ret.reserve(e.vals.size());
+ for(const auto& v : e.vals)
+ ret.push_back( v.clone() );
+ return ::MIR::RValue::make_Array({ mv$(ret) });
+ ),
+ // Create a new instance of a union (and eventually enum)
+ (Variant,
+ return ::MIR::RValue::make_Variant({ e.path.clone(), e.index, e.val.clone() });
+ ),
+ // Create a new instance of a struct (or enum)
+ (Struct,
+ ::std::vector<::MIR::LValue> ret;
+ ret.reserve(e.vals.size());
+ for(const auto& v : e.vals)
+ ret.push_back( v.clone() );
+ return ::MIR::RValue::make_Struct({ e.path.clone(), e.variant_idx, mv$(ret) });
+ )
+ )
+ throw "";
+}