diff options
Diffstat (limited to 'src/trans/monomorphise.cpp')
-rw-r--r-- | src/trans/monomorphise.cpp | 88 |
1 files changed, 44 insertions, 44 deletions
diff --git a/src/trans/monomorphise.cpp b/src/trans/monomorphise.cpp index 03623855..dd30dc7a 100644 --- a/src/trans/monomorphise.cpp +++ b/src/trans/monomorphise.cpp @@ -10,7 +10,7 @@ #include <hir/hir.hpp> namespace { - ::MIR::LValue monomorph_LValue(const ::HIR::Crate& crate, const Trans_Params& params, const ::MIR::LValue& tpl) + ::MIR::LValue monomorph_LValue(const ::StaticTraitResolve& resolve, const Trans_Params& params, const ::MIR::LValue& tpl) { TU_MATCHA( (tpl), (e), (Variable, return e; ), @@ -18,45 +18,45 @@ namespace { (Argument, return e; ), (Return, return e; ), (Static, - return params.monomorph(crate, e); + return params.monomorph(resolve, e); ), (Field, return ::MIR::LValue::make_Field({ - box$(monomorph_LValue(crate, params, *e.val)), + box$(monomorph_LValue(resolve, params, *e.val)), e.field_index }); ), (Deref, return ::MIR::LValue::make_Deref({ - box$(monomorph_LValue(crate, params, *e.val)) + box$(monomorph_LValue(resolve, params, *e.val)) }); ), (Index, return ::MIR::LValue::make_Index({ - box$(monomorph_LValue(crate, params, *e.val)), - box$(monomorph_LValue(crate, params, *e.idx)) + box$(monomorph_LValue(resolve, params, *e.val)), + box$(monomorph_LValue(resolve, params, *e.idx)) }); ), (Downcast, return ::MIR::LValue::make_Downcast({ - box$(monomorph_LValue(crate, params, *e.val)), + box$(monomorph_LValue(resolve, params, *e.val)), e.variant_index }); ) ) throw ""; } - ::std::vector<::MIR::LValue> monomorph_LValue_list(const ::HIR::Crate& crate, const Trans_Params& params, const ::std::vector<::MIR::LValue>& tpl) + ::std::vector<::MIR::LValue> monomorph_LValue_list(const ::StaticTraitResolve& resolve, const Trans_Params& params, const ::std::vector<::MIR::LValue>& tpl) { ::std::vector<::MIR::LValue> rv; rv.reserve( tpl.size() ); for(const auto& v : tpl) - rv.push_back( monomorph_LValue(crate, params, v) ); + rv.push_back( monomorph_LValue(resolve, params, v) ); return rv; } } -::MIR::FunctionPointer Trans_Monomorphise(const ::HIR::Crate& crate, const Trans_Params& params, const ::MIR::FunctionPointer& tpl) +::MIR::FunctionPointer Trans_Monomorphise(const ::StaticTraitResolve& resolve, const Trans_Params& params, const ::MIR::FunctionPointer& tpl) { static Span sp; TRACE_FUNCTION; @@ -68,13 +68,13 @@ namespace { for(const auto& var : tpl->named_variables) { DEBUG("- var" << output.named_variables.size()); - output.named_variables.push_back( params.monomorph(crate, var) ); + output.named_variables.push_back( params.monomorph(resolve, var) ); } output.temporaries.reserve( tpl->temporaries.size() ); for(const auto& ty : tpl->temporaries) { - DEBUG("- var" << output.temporaries.size()); - output.temporaries.push_back( params.monomorph(crate, ty) ); + DEBUG("- tmp" << output.temporaries.size()); + output.temporaries.push_back( params.monomorph(resolve, ty) ); } // 2. Monomorphise all paths @@ -94,7 +94,7 @@ namespace { DEBUG("- DROP " << e.slot); statements.push_back( ::MIR::Statement::make_Drop({ e.kind, - monomorph_LValue(crate, params, e.slot) + monomorph_LValue(resolve, params, e.slot) }) ); } else @@ -105,7 +105,7 @@ namespace { ::MIR::RValue rval; TU_MATCHA( (e.src), (se), (Use, - rval = ::MIR::RValue( monomorph_LValue(crate, params, se) ); + rval = ::MIR::RValue( monomorph_LValue(resolve, params, se) ); ), (Constant, TU_MATCHA( (se), (ce), @@ -129,11 +129,11 @@ namespace { ), (Const, rval = ::MIR::Constant::make_Const({ - params.monomorph(crate, ce.p) + params.monomorph(resolve, ce.p) }); ), (ItemAddr, - auto p = params.monomorph(crate, ce); + auto p = params.monomorph(resolve, ce); // TODO: If this is a pointer to a function on a trait object, replace with the address loaded from the vtable. // - Requires creating a new temporary for the vtable pointer. // - Also requires knowing what the receiver is. @@ -143,79 +143,79 @@ namespace { ), (SizedArray, rval = ::MIR::RValue::make_SizedArray({ - monomorph_LValue(crate, params, se.val), + monomorph_LValue(resolve, params, se.val), se.count }); ), (Borrow, rval = ::MIR::RValue::make_Borrow({ se.region, se.type, - monomorph_LValue(crate, params, se.val) + monomorph_LValue(resolve, params, se.val) }); ), (Cast, rval = ::MIR::RValue::make_Cast({ - monomorph_LValue(crate, params, se.val), - params.monomorph(crate, se.type) + monomorph_LValue(resolve, params, se.val), + params.monomorph(resolve, se.type) }); ), (BinOp, rval = ::MIR::RValue::make_BinOp({ - monomorph_LValue(crate, params, se.val_l), + monomorph_LValue(resolve, params, se.val_l), se.op, - monomorph_LValue(crate, params, se.val_r) + monomorph_LValue(resolve, params, se.val_r) }); ), (UniOp, rval = ::MIR::RValue::make_UniOp({ - monomorph_LValue(crate, params, se.val), + monomorph_LValue(resolve, params, se.val), se.op }); ), (DstMeta, - auto lv = monomorph_LValue(crate, params, se.val); + auto lv = monomorph_LValue(resolve, params, se.val); // TODO: Get the type of this, and if it's an array - replace with the size rval = ::MIR::RValue::make_DstMeta({ mv$(lv) }); ), (DstPtr, - rval = ::MIR::RValue::make_DstPtr({ monomorph_LValue(crate, params, se.val) }); + rval = ::MIR::RValue::make_DstPtr({ monomorph_LValue(resolve, params, se.val) }); ), (MakeDst, rval = ::MIR::RValue::make_MakeDst({ - monomorph_LValue(crate, params, se.ptr_val), - monomorph_LValue(crate, params, se.meta_val) + monomorph_LValue(resolve, params, se.ptr_val), + monomorph_LValue(resolve, params, se.meta_val) }); ), (Tuple, rval = ::MIR::RValue::make_Tuple({ - monomorph_LValue_list(crate, params, se.vals) + monomorph_LValue_list(resolve, params, se.vals) }); ), (Array, rval = ::MIR::RValue::make_Array({ - monomorph_LValue_list(crate, params, se.vals) + monomorph_LValue_list(resolve, params, se.vals) }); ), // Create a new instance of a union (and eventually enum) (Variant, rval = ::MIR::RValue::make_Variant({ - params.monomorph(crate, se.path), + params.monomorph(resolve, se.path), se.index, - monomorph_LValue(crate, params, se.val) + monomorph_LValue(resolve, params, se.val) }); ), // Create a new instance of a struct (or enum) (Struct, rval = ::MIR::RValue::make_Struct({ - params.monomorph(crate, se.path), + params.monomorph(resolve, se.path), se.variant_idx, - monomorph_LValue_list(crate, params, se.vals) + monomorph_LValue_list(resolve, params, se.vals) }); ) ) statements.push_back( ::MIR::Statement::make_Assign({ - monomorph_LValue(crate, params, e.dst), + monomorph_LValue(resolve, params, e.dst), mv$(rval) }) ); } @@ -243,28 +243,28 @@ namespace { ), (If, terminator = ::MIR::Terminator::make_If({ - monomorph_LValue(crate, params, e.cond), + monomorph_LValue(resolve, params, e.cond), e.bb0, e.bb1 }); ), (Switch, terminator = ::MIR::Terminator::make_Switch({ - monomorph_LValue(crate, params, e.val), + monomorph_LValue(resolve, params, e.val), e.targets }); ), (Call, struct H { - static ::MIR::CallTarget monomorph_calltarget(const ::HIR::Crate& crate, const Trans_Params& params, const ::MIR::CallTarget& ct) { + static ::MIR::CallTarget monomorph_calltarget(const ::StaticTraitResolve& resolve, const Trans_Params& params, const ::MIR::CallTarget& ct) { TU_MATCHA( (ct), (e), (Value, - return monomorph_LValue(crate, params, e); + return monomorph_LValue(resolve, params, e); ), (Path, - return params.monomorph(crate, e); + return params.monomorph(resolve, e); ), (Intrinsic, - return ::MIR::CallTarget::make_Intrinsic({ e.name, params.monomorph(crate, e.params) }); + return ::MIR::CallTarget::make_Intrinsic({ e.name, params.monomorph(resolve, e.params) }); ) ) throw ""; @@ -272,9 +272,9 @@ namespace { }; terminator = ::MIR::Terminator::make_Call({ e.ret_block, e.panic_block, - monomorph_LValue(crate, params, e.ret_val), - H::monomorph_calltarget(crate, params, e.fcn), - monomorph_LValue_list(crate, params, e.args) + monomorph_LValue(resolve, params, e.ret_val), + H::monomorph_calltarget(resolve, params, e.fcn), + monomorph_LValue_list(resolve, params, e.args) }); ) ) |