summaryrefslogtreecommitdiff
path: root/src/trans/monomorphise.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/trans/monomorphise.cpp')
-rw-r--r--src/trans/monomorphise.cpp88
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)
});
)
)