From 6fd914a1afc3d0d0f86e8a9a1bfacd55be053d58 Mon Sep 17 00:00:00 2001 From: Masaki Hara Date: Mon, 10 Sep 2018 23:00:50 +0900 Subject: [PATCH] Add vtable-shim helper methods for Instance. --- src/librustc/ty/instance.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/librustc/ty/instance.rs b/src/librustc/ty/instance.rs index 9410bea2182be..83029df0fe72f 100644 --- a/src/librustc/ty/instance.rs +++ b/src/librustc/ty/instance.rs @@ -237,6 +237,25 @@ impl<'a, 'b, 'tcx> Instance<'tcx> { result } + pub fn resolve_for_vtable(tcx: TyCtxt<'a, 'tcx, 'tcx>, + param_env: ty::ParamEnv<'tcx>, + def_id: DefId, + substs: &'tcx Substs<'tcx>) -> Option> { + debug!("resolve(def_id={:?}, substs={:?})", def_id, substs); + let fn_sig = tcx.fn_sig(def_id); + let is_vtable_shim = + fn_sig.inputs().skip_binder().len() > 0 && fn_sig.input(0).skip_binder().is_self(); + if is_vtable_shim { + debug!(" => associated item with unsizeable self: Self"); + Some(Instance { + def: InstanceDef::VtableShim(def_id), + substs, + }) + } else { + Instance::resolve(tcx, param_env, def_id, substs) + } + } + pub fn resolve_closure( tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId, @@ -251,6 +270,14 @@ impl<'a, 'b, 'tcx> Instance<'tcx> { _ => Instance::new(def_id, substs.substs) } } + + pub fn is_vtable_shim(&self) -> bool { + if let InstanceDef::VtableShim(..) = self.def { + true + } else { + false + } + } } fn resolve_associated_item<'a, 'tcx>(