param_substs,
callee_substs)
}
+ traits::VtableObject(ref data) => {
+ let trait_item_def_ids =
+ ty::trait_item_def_ids(ccx.tcx(), trait_id);
+ let method_offset_in_trait =
+ trait_item_def_ids.iter()
+ .position(|item| item.def_id() == method_id)
+ .unwrap();
+ let (llfn, ty) =
+ trans_object_shim(ccx, data.object_ty, trait_id, method_offset_in_trait);
+ immediate_rvalue(llfn, ty)
+ }
_ => {
tcx.sess.bug(&format!("static call to invalid vtable: {}",
vtbl.repr(tcx))[]);
Callee { bcx: bcx, data: Fn(llfn) }
}
traits::VtableObject(ref data) => {
- let llfn = trans_object_shim(bcx.ccx(), data.object_ty, trait_id, n_method);
+ let (llfn, _) = trans_object_shim(bcx.ccx(), data.object_ty, trait_id, n_method);
Callee { bcx: bcx, data: Fn(llfn) }
}
traits::VtableBuiltin(..) |
object_ty: Ty<'tcx>,
trait_id: ast::DefId,
method_offset_in_trait: uint)
- -> ValueRef
+ -> (ValueRef, Ty<'tcx>)
{
let _icx = push_ctxt("trans_object_shim");
let tcx = ccx.tcx();
finish_fn(&fcx, bcx, sig.output);
- llfn
+ (llfn, method_bare_fn_ty)
}
/// Creates a returns a dynamic vtable for the given type and vtable origin.
unsafe {
let tbl = C_struct(ccx, &components[], false);
let sym = token::gensym("vtable");
- let buf = CString::from_vec(format!("vtable{}", sym.uint()).into_bytes());
+ let buf = CString::from_vec(format!("vtable{}", sym.usize()).into_bytes());
let vt_gvar = llvm::LLVMAddGlobal(ccx.llmod(), val_ty(tbl).to_ref(),
buf.as_ptr());
llvm::LLVMSetInitializer(vt_gvar, tbl);