@@ -178,8 +178,8 @@ impl<T: ?Sized> Clone for PtrComponents<T> {
178178/// compare equal (since identical vtables can be deduplicated within a codegen unit).
179179#[ lang = "dyn_metadata" ]
180180pub struct DynMetadata < Dyn : ?Sized > {
181- _vtable_ptr : & ' static VTable ,
182- _phantom : crate :: marker:: PhantomData < Dyn > ,
181+ vtable_ptr : & ' static VTable ,
182+ phantom : crate :: marker:: PhantomData < Dyn > ,
183183}
184184
185185extern "C" {
@@ -191,17 +191,6 @@ extern "C" {
191191}
192192
193193impl < Dyn : ?Sized > DynMetadata < Dyn > {
194- /// One of the things that rustc_middle does with this being a lang item is
195- /// give it `FieldsShape::Primitive`, which means that as far as codegen can
196- /// tell, it *is* a reference, and thus doesn't have any fields.
197- /// That means we can't use field access, and have to transmute it instead.
198- #[ inline]
199- fn vtable_ptr ( self ) -> * const VTable {
200- // SAFETY: this layout assumption is hard-coded into the compiler.
201- // If it's somehow not a size match, the transmute will error.
202- unsafe { crate :: mem:: transmute :: < Self , & ' static VTable > ( self ) }
203- }
204-
205194 /// Returns the size of the type associated with this vtable.
206195 #[ inline]
207196 pub fn size_of ( self ) -> usize {
@@ -210,7 +199,7 @@ impl<Dyn: ?Sized> DynMetadata<Dyn> {
210199 // `Send` part!
211200 // SAFETY: DynMetadata always contains a valid vtable pointer
212201 return unsafe {
213- crate :: intrinsics:: vtable_size ( self . vtable_ptr ( ) as * const ( ) )
202+ crate :: intrinsics:: vtable_size ( self . vtable_ptr as * const VTable as * const ( ) )
214203 } ;
215204 }
216205
@@ -219,7 +208,7 @@ impl<Dyn: ?Sized> DynMetadata<Dyn> {
219208 pub fn align_of ( self ) -> usize {
220209 // SAFETY: DynMetadata always contains a valid vtable pointer
221210 return unsafe {
222- crate :: intrinsics:: vtable_align ( self . vtable_ptr ( ) as * const ( ) )
211+ crate :: intrinsics:: vtable_align ( self . vtable_ptr as * const VTable as * const ( ) )
223212 } ;
224213 }
225214
@@ -237,7 +226,7 @@ unsafe impl<Dyn: ?Sized> Sync for DynMetadata<Dyn> {}
237226
238227impl < Dyn : ?Sized > fmt:: Debug for DynMetadata < Dyn > {
239228 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
240- f. debug_tuple ( "DynMetadata" ) . field ( & self . vtable_ptr ( ) ) . finish ( )
229+ f. debug_tuple ( "DynMetadata" ) . field ( & ( self . vtable_ptr as * const VTable ) ) . finish ( )
241230 }
242231}
243232
@@ -259,15 +248,15 @@ impl<Dyn: ?Sized> Eq for DynMetadata<Dyn> {}
259248impl < Dyn : ?Sized > PartialEq for DynMetadata < Dyn > {
260249 #[ inline]
261250 fn eq ( & self , other : & Self ) -> bool {
262- crate :: ptr:: eq :: < VTable > ( self . vtable_ptr ( ) , other. vtable_ptr ( ) )
251+ crate :: ptr:: eq :: < VTable > ( self . vtable_ptr , other. vtable_ptr )
263252 }
264253}
265254
266255impl < Dyn : ?Sized > Ord for DynMetadata < Dyn > {
267256 #[ inline]
268257 #[ allow( ambiguous_wide_pointer_comparisons) ]
269258 fn cmp ( & self , other : & Self ) -> crate :: cmp:: Ordering {
270- < * const VTable > :: cmp ( & self . vtable_ptr ( ) , & other. vtable_ptr ( ) )
259+ ( self . vtable_ptr as * const VTable ) . cmp ( & ( other. vtable_ptr as * const VTable ) )
271260 }
272261}
273262
@@ -281,6 +270,6 @@ impl<Dyn: ?Sized> PartialOrd for DynMetadata<Dyn> {
281270impl < Dyn : ?Sized > Hash for DynMetadata < Dyn > {
282271 #[ inline]
283272 fn hash < H : Hasher > ( & self , hasher : & mut H ) {
284- crate :: ptr:: hash :: < VTable , _ > ( self . vtable_ptr ( ) , hasher)
273+ crate :: ptr:: hash :: < VTable , _ > ( self . vtable_ptr , hasher)
285274 }
286275}
0 commit comments