@@ -21,6 +21,7 @@ use rustc::middle::traits;
2121use rustc:: mir:: repr:: ItemKind ;
2222use trans:: common:: { Block , fulfill_obligation} ;
2323use trans:: base;
24+ use trans:: closure;
2425use trans:: expr;
2526use trans:: monomorphize;
2627use 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