提交 192e7c4b 编写于 作者: M Michael Hewson

Add comments explaining how codegen works for `dyn Trait` methods

上级 a468da9c
......@@ -315,6 +315,11 @@ fn new_vtable(cx: &CodegenCx<'ll, 'tcx>,
_ => bug!("receiver type has unsupported layout: {:?}", layout)
}
// In the case of Rc<Self>, we need to explicitly pass a *mut RcBox<Self>
// with a Scalar (not ScalarPair) ABI. This is a hack that is understood
// elsewhere in the compiler as a method on a `dyn Trait`.
// To get the type `*mut RcBox<Self>`, we just keep unwrapping newtypes until we
// get a built-in pointer type
let mut fat_pointer_layout = layout;
'descend_newtypes: while !fat_pointer_layout.ty.is_unsafe_ptr()
&& !fat_pointer_layout.ty.is_region_ptr()
......
......@@ -647,8 +647,12 @@ fn codegen_terminator(&mut self,
if let (0, Some(ty::InstanceDef::Virtual(_, idx))) = (i, def) {
if let Pair(..) = op.val {
// descend through newtype wrappers until `op` is a builtin pointer to
// `dyn Trait`, e.g. `*const dyn Trait`, `&mut dyn Trait`
// In the case of Rc<Self>, we need to explicitly pass a
// *mut RcBox<Self> with a Scalar (not ScalarPair) ABI. This is a hack
// that is understood elsewhere in the compiler as a method on
// `dyn Trait`.
// To get a `*mut RcBox<Self>`, we just keep unwrapping newtypes until
// we get a value of a built-in pointer type
'descend_newtypes: while !op.layout.ty.is_unsafe_ptr()
&& !op.layout.ty.is_region_ptr()
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册