@@ -48,6 +48,7 @@ pub enum StrongPtr<T> {
4848 Reinterpreted {
4949 alloc : Rc < dyn OriginalAlloc > ,
5050 byte_offset : usize ,
51+ elem_byte_size : usize ,
5152 // Local buffer for deref(). None until first access.
5253 // Read-through: refreshed from alloc on every deref() call.
5354 cell : RefCell < Option < T > > ,
@@ -63,10 +64,11 @@ impl<T: ByteRepr> StrongPtr<T> {
6364 StrongPtr :: Reinterpreted {
6465 alloc,
6566 byte_offset,
67+ elem_byte_size,
6668 cell,
6769 } => {
6870 // Read-through: always re-read from the original allocation.
69- let mut buf = vec ! [ 0u8 ; T :: byte_size ( ) ] ;
71+ let mut buf = vec ! [ 0u8 ; * elem_byte_size ] ;
7072 alloc. read_bytes ( * byte_offset, & mut buf) ;
7173 * cell. borrow_mut ( ) = Some ( T :: from_bytes ( & buf) ) ;
7274 Ref :: map ( cell. borrow ( ) , |opt| opt. as_ref ( ) . unwrap ( ) )
@@ -353,6 +355,7 @@ impl<T> Ptr<T> {
353355 PtrKind :: Reinterpreted ( data) => StrongPtr :: Reinterpreted {
354356 alloc : Rc :: clone ( & data. alloc ) ,
355357 byte_offset : self . offset ,
358+ elem_byte_size : data. elem_byte_size ,
356359 cell : RefCell :: new ( None ) ,
357360 } ,
358361 }
@@ -377,7 +380,7 @@ impl<T> Ptr<T> {
377380 rc. borrow_mut ( ) [ self . offset ] = value;
378381 }
379382 PtrKind :: Reinterpreted ( data) => {
380- let mut buf = vec ! [ 0u8 ; T :: byte_size ( ) ] ;
383+ let mut buf = vec ! [ 0u8 ; data . elem_byte_size ] ;
381384 value. to_bytes ( & mut buf) ;
382385 data. alloc . write_bytes ( self . offset , & buf) ;
383386 }
@@ -406,20 +409,26 @@ impl<T> Ptr<T> {
406409 panic ! ( "cannot reinterpret_cast to zero-sized type" ) ;
407410 }
408411
409- let src_byte_off = self . offset . wrapping_mul ( T :: byte_size ( ) ) ;
412+ self . reinterpret_sized :: < U > ( U :: byte_size ( ) )
413+ }
414+
415+ pub fn reinterpret_sized < U > ( & self , elem_byte_size : usize ) -> Ptr < U >
416+ where
417+ T : ByteRepr ,
418+ {
410419 let ( alloc, abs_byte_off) : ( Rc < dyn OriginalAlloc > , usize ) = match & self . kind {
411420 PtrKind :: Null => return Ptr :: null ( ) ,
412421 PtrKind :: StackSingle ( weak) | PtrKind :: HeapSingle ( weak) => (
413422 Rc :: new ( SingleOriginalAlloc { weak : weak. clone ( ) } ) ,
414- src_byte_off ,
423+ self . offset . wrapping_mul ( T :: byte_size ( ) ) ,
415424 ) ,
416425 PtrKind :: Vec ( weak) => (
417426 Rc :: new ( SliceOriginalAlloc { weak : weak. clone ( ) } ) ,
418- src_byte_off ,
427+ self . offset . wrapping_mul ( T :: byte_size ( ) ) ,
419428 ) ,
420429 PtrKind :: StackArray ( weak) | PtrKind :: HeapArray ( weak) => (
421430 Rc :: new ( SliceOriginalAlloc { weak : weak. clone ( ) } ) ,
422- src_byte_off ,
431+ self . offset . wrapping_mul ( T :: byte_size ( ) ) ,
423432 ) ,
424433 PtrKind :: Reinterpreted ( data) => ( Rc :: clone ( & data. alloc ) , self . offset ) ,
425434 } ;
@@ -428,7 +437,7 @@ impl<T> Ptr<T> {
428437 offset : abs_byte_off,
429438 kind : PtrKind :: Reinterpreted ( Rc :: new ( ReinterpretedView {
430439 alloc,
431- elem_byte_size : U :: byte_size ( ) ,
440+ elem_byte_size,
432441 } ) ) ,
433442 }
434443 }
@@ -457,7 +466,7 @@ impl<T> Ptr<T> {
457466 f ( & mut borrow[ self . offset ] )
458467 }
459468 PtrKind :: Reinterpreted ( data) => {
460- let mut buf = vec ! [ 0u8 ; T :: byte_size ( ) ] ;
469+ let mut buf = vec ! [ 0u8 ; data . elem_byte_size ] ;
461470 data. alloc . read_bytes ( self . offset , & mut buf) ;
462471 let mut val = T :: from_bytes ( & buf) ;
463472 let ret = f ( & mut val) ;
@@ -490,7 +499,7 @@ impl<T> Ptr<T> {
490499 f ( & borrow[ self . offset ] )
491500 }
492501 PtrKind :: Reinterpreted ( data) => {
493- let mut buf = vec ! [ 0u8 ; T :: byte_size ( ) ] ;
502+ let mut buf = vec ! [ 0u8 ; data . elem_byte_size ] ;
494503 data. alloc . read_bytes ( self . offset , & mut buf) ;
495504 let val = T :: from_bytes ( & buf) ;
496505 f ( & val)
@@ -517,7 +526,7 @@ impl<T: Clone + ByteRepr> Ptr<T> {
517526 weak. upgrade ( ) . expect ( "ub: dangling pointer" ) . borrow ( ) [ self . offset ] . clone ( )
518527 }
519528 PtrKind :: Reinterpreted ( ref data) => {
520- let mut buf = vec ! [ 0u8 ; T :: byte_size ( ) ] ;
529+ let mut buf = vec ! [ 0u8 ; data . elem_byte_size ] ;
521530 data. alloc . read_bytes ( self . offset , & mut buf) ;
522531 T :: from_bytes ( & buf)
523532 }
0 commit comments