about summary refs log tree commit diff
path: root/src/vtable.rs
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2020-03-10 20:41:31 +0100
committerbjorn3 <bjorn3@users.noreply.github.com>2020-03-10 20:41:31 +0100
commit240d56c33c1a0b7097e7b7da475f61fa1d57400f (patch)
tree46f1844ac5aad923f8ec3b7d19ccce384d3ac8f2 /src/vtable.rs
parentc53297f5ebe46f4d3ef0627c985a03871bd23780 (diff)
Support virtual calls with unsized self argument
Diffstat (limited to 'src/vtable.rs')
-rw-r--r--src/vtable.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/vtable.rs b/src/vtable.rs
index 5ce975d3124..e4b3a9942cf 100644
--- a/src/vtable.rs
+++ b/src/vtable.rs
@@ -47,7 +47,16 @@ pub fn get_ptr_and_method_ref<'tcx>(
     arg: CValue<'tcx>,
     idx: usize,
 ) -> (Value, Value) {
-    let (ptr, vtable) = arg.load_scalar_pair(fx);
+    let (ptr, vtable) = if let Abi::ScalarPair(_, _) = arg.layout().abi {
+        arg.load_scalar_pair(fx)
+    } else {
+        let (ptr, vtable) = arg.try_to_ptr().unwrap();
+        (
+            ptr.get_addr(fx),
+            vtable.unwrap()
+        )
+    };
+
     let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes();
     let func_ref = fx.bcx.ins().load(
         pointer_ty(fx.tcx),