]> git.lizzy.rs Git - rust.git/commitdiff
Add vtable-shim helper methods for Instance.
authorMasaki Hara <ackie.h.gmai@gmail.com>
Mon, 10 Sep 2018 14:00:50 +0000 (23:00 +0900)
committerMasaki Hara <ackie.h.gmai@gmail.com>
Wed, 24 Oct 2018 12:59:06 +0000 (21:59 +0900)
src/librustc/ty/instance.rs

index 9410bea2182bec8e942d6424ddc3263b0d983634..83029df0fe72fa05d164c3f91e177610f0bdf4fa 100644 (file)
@@ -237,6 +237,25 @@ pub fn resolve(tcx: TyCtxt<'a, 'tcx, '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<Instance<'tcx>> {
+        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 @@ pub fn resolve_closure(
             _ => 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>(