@@ -448,31 +448,30 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
448448    } 
449449
450450    fn  read_os_str_from_target_str < ' a > ( & ' a  self ,  scalar :  Scalar < Tag > )  -> InterpResult < ' tcx ,  OsString >  { 
451-         if  cfg ! ( target_os = "unix" )  { 
452-             self . read_os_str_from_c_str ( scalar) 
453-         }  else  if  cfg ! ( target_os = "windows" )  { 
454-             self . read_os_str_from_wide_str ( scalar) 
455-         }  else  { 
456-             throw_unsup_format ! ( "support for target OS not yet available" ) 
451+         let  target_os = self . eval_context_ref ( ) . tcx . sess . target . target . target_os . as_str ( ) ; 
452+         match  target_os { 
453+             "linux"  => self . read_os_str_from_c_str ( scalar) . map ( |x| x. to_os_string ( ) ) , 
454+             "windows"  => self . read_os_str_from_wide_str ( scalar) , 
455+             _ => throw_unsup_format ! ( "support for target OS not yet available" ) , 
457456        } 
458457    } 
459458
460459    /// Helper function to read an OsString from a null-terminated sequence of bytes, which is what 
461460     /// the Unix APIs usually handle. 
462-      fn  read_os_str_from_c_str < ' a > ( & ' a  self ,  scalar :  Scalar < Tag > )  -> InterpResult < ' tcx ,  OsString > 
461+      fn  read_os_str_from_c_str < ' a > ( & ' a  self ,  scalar :  Scalar < Tag > )  -> InterpResult < ' tcx ,  & ' a   OsStr > 
463462    where 
464463        ' tcx :  ' a , 
465464        ' mir :  ' a , 
466465    { 
467466        #[ cfg( target_os = "unix" ) ]  
468-         fn  bytes_to_os_str < ' tcx > ( bytes :  & [ u8 ] )  -> InterpResult < ' tcx ,  OsString >  { 
469-             Ok ( std:: os:: unix:: ffi:: OsStringExt :: from_bytes ( bytes) . to_os_string ( ) ) 
467+         fn  bytes_to_os_str < ' tcx ,   ' a > ( bytes :  & ' a   [ u8 ] )  -> InterpResult < ' tcx ,  & ' a   OsStr >  { 
468+             Ok ( std:: os:: unix:: ffi:: OsStringExt :: from_bytes ( bytes) ) 
470469        } 
471470        #[ cfg( not( target_os = "unix" ) ) ]  
472-         fn  bytes_to_os_str < ' tcx > ( bytes :  & [ u8 ] )  -> InterpResult < ' tcx ,  OsString >  { 
471+         fn  bytes_to_os_str < ' tcx ,   ' a > ( bytes :  & ' a   [ u8 ] )  -> InterpResult < ' tcx ,  & ' a   OsStr >  { 
473472            let  s = std:: str:: from_utf8 ( bytes) 
474473                . map_err ( |_| err_unsup_format ! ( "{:?} is not a valid utf-8 string" ,  bytes) ) ?; 
475-             Ok ( OsStr :: new ( s) . to_os_string ( ) ) 
474+             Ok ( OsStr :: new ( s) ) 
476475        } 
477476
478477        let  this = self . eval_context_ref ( ) ; 
@@ -509,12 +508,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
509508        mplace :  MPlaceTy < ' tcx ,  Tag > , 
510509        size :  u64 , 
511510    )  -> InterpResult < ' tcx ,  ( bool ,  u64 ) >  { 
512-         if  cfg ! ( target_os = "unix" )  { 
513-             self . write_os_str_to_c_str ( os_str,  mplace. ptr ,  size) 
514-         }  else  if  cfg ! ( target_os = "windows" )  { 
515-             self . write_os_str_to_wide_str ( os_str,  mplace,  size) 
516-         }  else  { 
517-             panic ! ( "support for target OS not yet available" ) 
511+         let  target_os = self . eval_context_ref ( ) . tcx . sess . target . target . target_os . as_str ( ) ; 
512+         match  target_os { 
513+             "linux"  => self . write_os_str_to_c_str ( os_str,  mplace. ptr ,  size) , 
514+             "windows"  => self . write_os_str_to_wide_str ( os_str,  mplace,  size) , 
515+             _ => panic ! ( "support for target OS not yet available" ) , 
518516        } 
519517    } 
520518
@@ -574,7 +572,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
574572        } 
575573        #[ cfg( not( target_os = "windows" ) ) ]  
576574        fn  os_str_to_u16vec ( os_str :  & OsStr )  -> Vec < u16 >  { 
577-             os_str. to_str ( ) . encode_utf16 ( ) . collect ( ) 
575+             os_str. to_str ( ) . unwrap ( ) . encode_utf16 ( ) . collect ( ) 
578576        } 
579577
580578        let  u16_vec = os_str_to_u16vec ( os_str) ; 
@@ -589,7 +587,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
589587
590588        // Store the UTF-16 string. 
591589        let  char_size = Size :: from_bytes ( 2 ) ; 
592-         for  ( idx,  & c)  in  u16_vec. iter ( ) . enumerate ( )  { 
590+         for  ( idx,  c)  in  u16_vec. into_iter ( ) . chain ( iter:: once ( 0x0000 ) ) . enumerate ( )  { 
593591            let  place = this. mplace_field ( mplace,  idx as  u64 ) ?;  
594592            this. write_scalar ( Scalar :: from_uint ( c,  char_size) ,  place. into ( ) ) ?; 
595593        } 
@@ -601,12 +599,10 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
601599        os_str :  & OsStr , 
602600        memkind :  MemoryKind < MiriMemoryKind > , 
603601    )  -> MPlaceTy < ' tcx ,  Tag >  { 
604-         if  cfg ! ( target_os = "unix" )  { 
605-             self . alloc_os_str_as_c_str ( os_str,  memkind) 
606-         }  else  if  cfg ! ( target_os = "windows" )  { 
607-             self . alloc_os_str_as_wide_str ( os_str,  memkind) 
608-         }  else  { 
609-             panic ! ( "support for target OS not yet available" ) 
602+         let  target_os = self . eval_context_ref ( ) . tcx . sess . target . target . target_os . as_str ( ) ; 
603+         match  target_os { 
604+             "linux"  => self . alloc_os_str_as_c_str ( os_str,  memkind) , 
605+             "windows"  => self . alloc_os_str_as_wide_str ( os_str,  memkind) , 
610606        } 
611607    } 
612608
0 commit comments