@@ -78,6 +78,7 @@ pub type Cc<T> = RawCc<T, ObjectSpace>;
78
78
pub type Weak < T > = RawWeak < T , ObjectSpace > ;
79
79
80
80
/// Low-level type for [`Cc<T>`](type.Cc.html).
81
+ #[ repr( transparent) ]
81
82
pub struct RawCc < T : ?Sized , O : AbstractObjectSpace > ( NonNull < RawCcBox < T , O > > ) ;
82
83
83
84
/// Low-level type for [`Weak<T>`](type.Weak.html).
@@ -225,9 +226,8 @@ impl<T: Trace, O: AbstractObjectSpace> RawCc<T, O> {
225
226
// Cc<dyn Trace> has 2 usize values: The first one is the same
226
227
// as Cc<T>. The second one is the vtable. The vtable pointer
227
228
// is the same as the second pointer of `&dyn Trace`.
228
- let mut fat_ptr: [ usize ; 2 ] = mem:: transmute ( self . inner ( ) . deref ( ) as & dyn Trace ) ;
229
- let self_ptr: usize = mem:: transmute ( self ) ;
230
- fat_ptr[ 0 ] = self_ptr;
229
+ let fat_ptr: * const dyn Trace = & * * self . inner ( ) ;
230
+ let fat_ptr = fat_ptr. with_addr ( mem:: transmute :: < RawCc < T , O > , usize > ( self ) ) ;
231
231
mem:: transmute ( fat_ptr)
232
232
}
233
233
}
@@ -236,11 +236,15 @@ impl<T: Trace, O: AbstractObjectSpace> RawCc<T, O> {
236
236
/// Create Cc<dyn Trait> from Cc<T> where T: impl Trait, Trait is trait object
237
237
#[ macro_export]
238
238
macro_rules! cc_dyn {
239
- ( $( #[ $( $meta: meta) +] ) * $conv: ident, $t: path $( , $new_vis: vis fn new( ) { ...} ) ?) => {
239
+ (
240
+ $( #[ $( $meta: meta) +] ) *
241
+ $conv: ident $( <$( $gen: ident $( : $( $gen_bound: path) ,+) ?) ,+>) ?,
242
+ $t: path $( , $new_vis: vis fn new( ) { ...} ) ?
243
+ ) => {
240
244
$( #[ $( $meta) +] ) *
241
245
#[ repr( transparent) ]
242
- pub struct $conv( $crate:: Cc <dyn $t>) ;
243
- impl $crate:: Trace for $conv {
246
+ pub struct $conv$ ( <$ ( $gen ) ,+> ) ? ( $crate:: Cc <dyn $t>) ;
247
+ impl $ ( <$ ( $gen : ' static ) ,+> ) ? $crate:: Trace for $conv$ ( <$ ( $gen ) ,+> ) ? {
244
248
fn trace( & self , tracer: & mut $crate:: Tracer ) {
245
249
$crate:: Cc :: <dyn $t>:: trace( & self . 0 , tracer)
246
250
}
@@ -250,17 +254,14 @@ macro_rules! cc_dyn {
250
254
true
251
255
}
252
256
}
253
- impl $ conv {
257
+ impl $ ( <$ ( $gen $ ( : $ ( $gen_bound ) ,+ ) ? ) ,+> ) ? $ conv$ ( <$ ( $gen ) ,+> ) ? {
254
258
$( $new_vis) ? fn new<T : $t + $crate:: Trace >( input: T ) -> Self {
255
- use std:: ops:: Deref ;
256
- unsafe {
257
- let cc: $crate:: RawCc <_, _> = $crate:: Cc :: new( input) ;
258
- let mut fat_ptr: [ usize ; 2 ] =
259
- core:: mem:: transmute( cc. inner( ) . deref( ) as & dyn $t) ;
260
- let self_ptr: usize = core:: mem:: transmute( cc) ;
261
- fat_ptr[ 0 ] = self_ptr;
262
- $conv( core:: mem:: transmute:: <[ usize ; 2 ] , $crate:: RawCc <dyn $t, _>>( fat_ptr) )
263
- }
259
+ let cc: $crate:: RawCc <_, _> = $crate:: Cc :: new( input) ;
260
+ let ptr: * const dyn $t = & * * cc. inner( ) ;
261
+ let ptr = unsafe {
262
+ ptr. with_addr( core:: mem:: transmute:: <$crate:: RawCc <T , _>, usize >( cc) )
263
+ } ;
264
+ $conv( unsafe { core:: mem:: transmute:: <* const dyn $t, $crate:: RawCc <dyn $t, _>>( ptr) } )
264
265
}
265
266
}
266
267
} ;
0 commit comments