mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-03 05:27:36 +00:00
Add comments explaining how codegen works for dyn Trait
methods
This commit is contained in:
parent
a468da9cfb
commit
192e7c4b51
@ -315,6 +315,11 @@ impl<'tcx> FnTypeExt<'tcx> for FnType<'tcx, Ty<'tcx>> {
|
|||||||
_ => bug!("receiver type has unsupported layout: {:?}", layout)
|
_ => 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;
|
let mut fat_pointer_layout = layout;
|
||||||
'descend_newtypes: while !fat_pointer_layout.ty.is_unsafe_ptr()
|
'descend_newtypes: while !fat_pointer_layout.ty.is_unsafe_ptr()
|
||||||
&& !fat_pointer_layout.ty.is_region_ptr()
|
&& !fat_pointer_layout.ty.is_region_ptr()
|
||||||
|
@ -647,8 +647,12 @@ impl FunctionCx<'a, 'll, 'tcx> {
|
|||||||
|
|
||||||
if let (0, Some(ty::InstanceDef::Virtual(_, idx))) = (i, def) {
|
if let (0, Some(ty::InstanceDef::Virtual(_, idx))) = (i, def) {
|
||||||
if let Pair(..) = op.val {
|
if let Pair(..) = op.val {
|
||||||
// descend through newtype wrappers until `op` is a builtin pointer to
|
// In the case of Rc<Self>, we need to explicitly pass a
|
||||||
// `dyn Trait`, e.g. `*const dyn Trait`, `&mut dyn Trait`
|
// *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()
|
'descend_newtypes: while !op.layout.ty.is_unsafe_ptr()
|
||||||
&& !op.layout.ty.is_region_ptr()
|
&& !op.layout.ty.is_region_ptr()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user