@@ -394,7 +394,6 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
394
394
}
395
395
396
396
pub fn write_primval ( & mut self , ptr : Pointer , val : PrimVal ) -> EvalResult < ' tcx , ( ) > {
397
- use std:: mem:: transmute;
398
397
let pointer_size = self . pointer_size ( ) ;
399
398
match val {
400
399
PrimVal :: Bool ( b) => self . write_bool ( ptr, b) ,
@@ -408,8 +407,8 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
408
407
PrimVal :: U64 ( n) => self . write_uint ( ptr, n as u64 , 8 ) ,
409
408
PrimVal :: Char ( c) => self . write_uint ( ptr, c as u64 , 4 ) ,
410
409
PrimVal :: IntegerPtr ( n) => self . write_uint ( ptr, n as u64 , pointer_size) ,
411
- PrimVal :: F32 ( f) => self . write_uint ( ptr, unsafe { transmute :: < _ , u32 > ( f ) } as u64 , 4 ) ,
412
- PrimVal :: F64 ( f) => self . write_uint ( ptr, unsafe { transmute :: < _ , u64 > ( f ) } , 8 ) ,
410
+ PrimVal :: F32 ( f) => self . write_f32 ( ptr, f ) ,
411
+ PrimVal :: F64 ( f) => self . write_f64 ( ptr, f ) ,
413
412
PrimVal :: FnPtr ( _p) |
414
413
PrimVal :: AbstractPtr ( _p) => unimplemented ! ( ) ,
415
414
}
@@ -467,6 +466,28 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
467
466
let size = self . pointer_size ( ) ;
468
467
self . write_uint ( ptr, n, size)
469
468
}
469
+
470
+ pub fn write_f32 ( & mut self , ptr : Pointer , f : f32 ) -> EvalResult < ' tcx , ( ) > {
471
+ let endianess = self . endianess ( ) ;
472
+ let b = self . get_bytes_mut ( ptr, 4 ) ?;
473
+ write_target_f32 ( endianess, b, f) . unwrap ( ) ;
474
+ Ok ( ( ) )
475
+ }
476
+
477
+ pub fn write_f64 ( & mut self , ptr : Pointer , f : f64 ) -> EvalResult < ' tcx , ( ) > {
478
+ let endianess = self . endianess ( ) ;
479
+ let b = self . get_bytes_mut ( ptr, 8 ) ?;
480
+ write_target_f64 ( endianess, b, f) . unwrap ( ) ;
481
+ Ok ( ( ) )
482
+ }
483
+
484
+ pub fn read_f32 ( & self , ptr : Pointer ) -> EvalResult < ' tcx , f32 > {
485
+ self . get_bytes ( ptr, 4 ) . map ( |b| read_target_f32 ( self . endianess ( ) , b) . unwrap ( ) )
486
+ }
487
+
488
+ pub fn read_f64 ( & self , ptr : Pointer ) -> EvalResult < ' tcx , f64 > {
489
+ self . get_bytes ( ptr, 8 ) . map ( |b| read_target_f64 ( self . endianess ( ) , b) . unwrap ( ) )
490
+ }
470
491
}
471
492
472
493
/// Relocations
@@ -589,6 +610,36 @@ fn read_target_int(endianess: layout::Endian, mut source: &[u8]) -> Result<i64,
589
610
}
590
611
}
591
612
613
+ ////////////////////////////////////////////////////////////////////////////////
614
+ // Methods to access floats in the target endianess
615
+ ////////////////////////////////////////////////////////////////////////////////
616
+
617
+ fn write_target_f32 ( endianess : layout:: Endian , mut target : & mut [ u8 ] , data : f32 ) -> Result < ( ) , byteorder:: Error > {
618
+ match endianess {
619
+ layout:: Endian :: Little => target. write_f32 :: < LittleEndian > ( data) ,
620
+ layout:: Endian :: Big => target. write_f32 :: < BigEndian > ( data) ,
621
+ }
622
+ }
623
+ fn write_target_f64 ( endianess : layout:: Endian , mut target : & mut [ u8 ] , data : f64 ) -> Result < ( ) , byteorder:: Error > {
624
+ match endianess {
625
+ layout:: Endian :: Little => target. write_f64 :: < LittleEndian > ( data) ,
626
+ layout:: Endian :: Big => target. write_f64 :: < BigEndian > ( data) ,
627
+ }
628
+ }
629
+
630
+ fn read_target_f32 ( endianess : layout:: Endian , mut source : & [ u8 ] ) -> Result < f32 , byteorder:: Error > {
631
+ match endianess {
632
+ layout:: Endian :: Little => source. read_f32 :: < LittleEndian > ( ) ,
633
+ layout:: Endian :: Big => source. read_f32 :: < BigEndian > ( ) ,
634
+ }
635
+ }
636
+ fn read_target_f64 ( endianess : layout:: Endian , mut source : & [ u8 ] ) -> Result < f64 , byteorder:: Error > {
637
+ match endianess {
638
+ layout:: Endian :: Little => source. read_f64 :: < LittleEndian > ( ) ,
639
+ layout:: Endian :: Big => source. read_f64 :: < BigEndian > ( ) ,
640
+ }
641
+ }
642
+
592
643
////////////////////////////////////////////////////////////////////////////////
593
644
// Undefined byte tracking
594
645
////////////////////////////////////////////////////////////////////////////////
0 commit comments