Skip to content

Commit 7d35719

Browse files
[MIR] Implement calling of closures and add missing monomorphization when translating function references.
1 parent 04b6c49 commit 7d35719

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

src/librustc_trans/trans/mir/constant.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,10 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
8989
{
9090
let ty = bcx.monomorphize(&constant.ty);
9191
match constant.literal {
92-
mir::Literal::Item { def_id, kind, substs } =>
93-
self.trans_item_ref(bcx, ty, kind, substs, def_id),
92+
mir::Literal::Item { def_id, kind, substs } => {
93+
let substs = bcx.tcx().mk_substs(bcx.monomorphize(&substs));
94+
self.trans_item_ref(bcx, ty, kind, substs, def_id)
95+
}
9496
mir::Literal::Value { ref value } => {
9597
self.trans_constval(bcx, value, ty)
9698
}

src/librustc_trans/trans/mir/did.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use rustc::middle::traits;
2121
use rustc::mir::repr::ItemKind;
2222
use trans::common::{Block, fulfill_obligation};
2323
use trans::base;
24+
use trans::closure;
2425
use trans::expr;
2526
use trans::monomorphize;
2627
use trans::meth;
@@ -38,6 +39,9 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
3839
substs: &'tcx Substs<'tcx>,
3940
did: DefId)
4041
-> OperandRef<'tcx> {
42+
debug!("trans_item_ref(ty={:?}, kind={:?}, substs={:?}, did={})",
43+
ty, kind, substs, bcx.tcx().item_path_str(did));
44+
4145
match kind {
4246
ItemKind::Function => self.trans_fn_ref(bcx, ty, substs, did),
4347
ItemKind::Method => match bcx.tcx().impl_or_trait_item(did).container() {
@@ -68,6 +72,9 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
6872
substs: &'tcx Substs<'tcx>,
6973
did: DefId)
7074
-> OperandRef<'tcx> {
75+
debug!("trans_fn_ref(ty={:?}, substs={:?}, did={})",
76+
ty, substs, bcx.tcx().item_path_str(did));
77+
7178
let did = inline::maybe_instantiate_inline(bcx.ccx(), did);
7279

7380
if !substs.types.is_empty() || is_named_tuple_constructor(bcx.tcx(), did) {
@@ -101,9 +108,14 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
101108
trait_id: DefId,
102109
substs: &'tcx Substs<'tcx>)
103110
-> OperandRef<'tcx> {
111+
debug!("trans_static_method(ty={:?}, method={}, trait={}, substs={:?})",
112+
ty,
113+
bcx.tcx().item_path_str(method_id),
114+
bcx.tcx().item_path_str(trait_id),
115+
substs);
116+
104117
let ccx = bcx.ccx();
105118
let tcx = bcx.tcx();
106-
let mname = tcx.item_name(method_id);
107119
let subst::SeparateVecsPerParamSpace {
108120
types: rcvr_type,
109121
selfs: rcvr_self,
@@ -118,6 +130,9 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
118130
match vtbl {
119131
traits::VtableImpl(traits::VtableImplData { impl_def_id, substs: imp_substs, .. }) => {
120132
assert!(!imp_substs.types.needs_infer());
133+
134+
let mname = tcx.item_name(method_id);
135+
121136
let subst::SeparateVecsPerParamSpace {
122137
types: impl_type,
123138
selfs: impl_self,
@@ -130,6 +145,17 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
130145
let mthsubsts = tcx.mk_substs(mth.substs);
131146
self.trans_fn_ref(bcx, ty, mthsubsts, mth.method.def_id)
132147
},
148+
traits::VtableClosure(data) => {
149+
let trait_closure_kind = bcx.tcx().lang_items.fn_trait_kind(trait_id).unwrap();
150+
let llfn = closure::trans_closure_method(bcx.ccx(),
151+
data.closure_def_id,
152+
data.substs,
153+
trait_closure_kind);
154+
OperandRef {
155+
ty: ty,
156+
val: OperandValue::Immediate(llfn)
157+
}
158+
},
133159
traits::VtableObject(ref data) => {
134160
let idx = traits::get_vtable_index_of_object_method(tcx, data, method_id);
135161
OperandRef::from_rvalue_datum(

0 commit comments

Comments
 (0)