@@ -178,8 +178,8 @@ impl<T: ?Sized> Clone for PtrComponents<T> {
178
178
/// compare equal (since identical vtables can be deduplicated within a codegen unit).
179
179
#[ lang = "dyn_metadata" ]
180
180
pub 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 > ,
183
183
}
184
184
185
185
extern "C" {
@@ -191,17 +191,6 @@ extern "C" {
191
191
}
192
192
193
193
impl < 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
-
205
194
/// Returns the size of the type associated with this vtable.
206
195
#[ inline]
207
196
pub fn size_of ( self ) -> usize {
@@ -210,7 +199,7 @@ impl<Dyn: ?Sized> DynMetadata<Dyn> {
210
199
// `Send` part!
211
200
// SAFETY: DynMetadata always contains a valid vtable pointer
212
201
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 ( ) )
214
203
} ;
215
204
}
216
205
@@ -219,7 +208,7 @@ impl<Dyn: ?Sized> DynMetadata<Dyn> {
219
208
pub fn align_of ( self ) -> usize {
220
209
// SAFETY: DynMetadata always contains a valid vtable pointer
221
210
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 ( ) )
223
212
} ;
224
213
}
225
214
@@ -237,7 +226,7 @@ unsafe impl<Dyn: ?Sized> Sync for DynMetadata<Dyn> {}
237
226
238
227
impl < Dyn : ?Sized > fmt:: Debug for DynMetadata < Dyn > {
239
228
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 ( )
241
230
}
242
231
}
243
232
@@ -259,15 +248,15 @@ impl<Dyn: ?Sized> Eq for DynMetadata<Dyn> {}
259
248
impl < Dyn : ?Sized > PartialEq for DynMetadata < Dyn > {
260
249
#[ inline]
261
250
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 )
263
252
}
264
253
}
265
254
266
255
impl < Dyn : ?Sized > Ord for DynMetadata < Dyn > {
267
256
#[ inline]
268
257
#[ allow( ambiguous_wide_pointer_comparisons) ]
269
258
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 ) )
271
260
}
272
261
}
273
262
@@ -281,6 +270,6 @@ impl<Dyn: ?Sized> PartialOrd for DynMetadata<Dyn> {
281
270
impl < Dyn : ?Sized > Hash for DynMetadata < Dyn > {
282
271
#[ inline]
283
272
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)
285
274
}
286
275
}
0 commit comments