提交 4e83659b 编写于 作者: O Oliver Schneider

Fix manual rust-call impls

上级 d71f24c0
......@@ -227,13 +227,19 @@ fn eval_fn_call(
let (arg_val, arg_ty) = args.remove(0);
let layout = self.type_layout(arg_ty)?;
if let (&ty::TyTuple(fields, _), &Layout::Univariant { ref variant, .. }) = (&arg_ty.sty, layout) {
let offsets = variant.offsets.iter().map(|s| s.bytes());
if let Value::ByRef(ptr) = arg_val {
for ((offset, ty), arg_local) in offsets.zip(fields).zip(arg_locals) {
let arg = Value::ByRef(ptr.offset(offset));
let dest = self.eval_lvalue(&mir::Lvalue::Local(arg_local))?;
self.write_value(arg, dest, ty)?;
if self.frame().mir.args_iter().count() == fields.len() + 1 {
let offsets = variant.offsets.iter().map(|s| s.bytes());
if let Value::ByRef(ptr) = arg_val {
for ((offset, ty), arg_local) in offsets.zip(fields).zip(arg_locals) {
let arg = Value::ByRef(ptr.offset(offset));
let dest = self.eval_lvalue(&mir::Lvalue::Local(arg_local))?;
self.write_value(arg, dest, ty)?;
}
}
} else {
// called a manual impl of a rust-call function
let dest = self.eval_lvalue(&mir::Lvalue::Local(arg_locals.next().unwrap()))?;
self.write_value(arg_val, dest, arg_ty)?;
}
} else {
bug!("rust-call ABI tuple argument was {:?}, {:?}", arg_ty, layout);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册