@@ -49,7 +49,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
4949 ptr : Scalar < Tag > ,
5050 ) -> InterpResult < ' tcx > {
5151 let this = self . eval_context_mut ( ) ;
52- if !ptr . is_null_ptr ( this ) {
52+ if !this . is_null ( ptr ) ? {
5353 let ptr = this. force_ptr ( ptr) ?;
5454 this. memory_mut ( ) . deallocate (
5555 ptr,
@@ -67,7 +67,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
6767 ) -> InterpResult < ' tcx , Scalar < Tag > > {
6868 let this = self . eval_context_mut ( ) ;
6969 let align = this. min_align ( ) ;
70- if old_ptr . is_null_ptr ( this ) {
70+ if this . is_null ( old_ptr ) ? {
7171 if new_size == 0 {
7272 Ok ( Scalar :: from_int ( 0 , this. pointer_size ( ) ) )
7373 } else {
@@ -429,7 +429,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
429429 let mut success = None ;
430430 {
431431 let name_ptr = this. read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?;
432- if !name_ptr . is_null_ptr ( this ) {
432+ if !this . is_null ( name_ptr ) ? {
433433 let name_ptr = name_ptr. to_ptr ( ) ?;
434434 let name = this
435435 . memory ( )
@@ -457,7 +457,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
457457 let name_ptr = this. read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?;
458458 let value_ptr = this. read_scalar ( args[ 1 ] ) ?. to_ptr ( ) ?;
459459 let value = this. memory ( ) . get ( value_ptr. alloc_id ) ?. read_c_str ( tcx, value_ptr) ?;
460- if !name_ptr . is_null_ptr ( this ) {
460+ if !this . is_null ( name_ptr ) ? {
461461 let name_ptr = name_ptr. to_ptr ( ) ?;
462462 let name = this. memory ( ) . get ( name_ptr. alloc_id ) ?. read_c_str ( tcx, name_ptr) ?;
463463 if !name. is_empty ( ) && !name. contains ( & b'=' ) {
@@ -640,14 +640,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
640640 let key_ptr = this. read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?;
641641
642642 // Extract the function type out of the signature (that seems easier than constructing it ourselves).
643- let dtor = match this. read_scalar ( args[ 1 ] ) ?. not_undef ( ) ? {
644- Scalar :: Ptr ( dtor_ptr) => Some ( this. memory ( ) . get_fn ( dtor_ptr) ?) ,
645- Scalar :: Raw { data : 0 , size } => {
646- // NULL pointer
647- assert_eq ! ( size as u64 , this. memory( ) . pointer_size( ) . bytes( ) ) ;
648- None
649- } ,
650- Scalar :: Raw { .. } => return err ! ( ReadBytesAsPointer ) ,
643+ let dtor = match this. test_null ( this. read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?) ? {
644+ Some ( dtor_ptr) => Some ( this. memory ( ) . get_fn ( dtor_ptr. to_ptr ( ) ?) ?) ,
645+ None => None ,
651646 } ;
652647
653648 // Figure out how large a pthread TLS key actually is.
@@ -659,7 +654,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
659654 let key_layout = this. layout_of ( key_type) ?;
660655
661656 // Create key and write it into the memory where `key_ptr` wants it.
662- let key = this. machine . tls . create_tls_key ( dtor, tcx ) as u128 ;
657+ let key = this. machine . tls . create_tls_key ( dtor) as u128 ;
663658 if key_layout. size . bits ( ) < 128 && key >= ( 1u128 << key_layout. size . bits ( ) as u128 ) {
664659 return err ! ( OutOfTls ) ;
665660 }
@@ -684,13 +679,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
684679 }
685680 "pthread_getspecific" => {
686681 let key = this. read_scalar ( args[ 0 ] ) ?. to_bits ( args[ 0 ] . layout . size ) ?;
687- let ptr = this. machine . tls . load_tls ( key) ?;
682+ let ptr = this. machine . tls . load_tls ( key, tcx ) ?;
688683 this. write_scalar ( ptr, dest) ?;
689684 }
690685 "pthread_setspecific" => {
691686 let key = this. read_scalar ( args[ 0 ] ) ?. to_bits ( args[ 0 ] . layout . size ) ?;
692687 let new_ptr = this. read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?;
693- this. machine . tls . store_tls ( key, new_ptr) ?;
688+ this. machine . tls . store_tls ( key, this . test_null ( new_ptr) ? ) ?;
694689
695690 // Return success (`0`).
696691 this. write_null ( dest) ?;
@@ -844,7 +839,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
844839 // This just creates a key; Windows does not natively support TLS destructors.
845840
846841 // Create key and return it.
847- let key = this. machine . tls . create_tls_key ( None , tcx ) as u128 ;
842+ let key = this. machine . tls . create_tls_key ( None ) as u128 ;
848843
849844 // Figure out how large a TLS key actually is. This is `c::DWORD`.
850845 if dest. layout . size . bits ( ) < 128
@@ -855,13 +850,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
855850 }
856851 "TlsGetValue" => {
857852 let key = this. read_scalar ( args[ 0 ] ) ?. to_u32 ( ) ? as u128 ;
858- let ptr = this. machine . tls . load_tls ( key) ?;
853+ let ptr = this. machine . tls . load_tls ( key, tcx ) ?;
859854 this. write_scalar ( ptr, dest) ?;
860855 }
861856 "TlsSetValue" => {
862857 let key = this. read_scalar ( args[ 0 ] ) ?. to_u32 ( ) ? as u128 ;
863858 let new_ptr = this. read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?;
864- this. machine . tls . store_tls ( key, new_ptr) ?;
859+ this. machine . tls . store_tls ( key, this . test_null ( new_ptr) ? ) ?;
865860
866861 // Return success (`1`).
867862 this. write_scalar ( Scalar :: from_int ( 1 , dest. layout . size ) , dest) ?;
@@ -938,10 +933,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
938933 Ok ( ( ) )
939934 }
940935
941- fn write_null ( & mut self , dest : PlaceTy < ' tcx , Tag > ) -> InterpResult < ' tcx > {
942- self . eval_context_mut ( ) . write_scalar ( Scalar :: from_int ( 0 , dest. layout . size ) , dest)
943- }
944-
945936 /// Evaluates the scalar at the specified path. Returns Some(val)
946937 /// if the path could be resolved, and None otherwise
947938 fn eval_path_scalar ( & mut self , path : & [ & str ] ) -> InterpResult < ' tcx , Option < ScalarMaybeUndef < Tag > > > {
0 commit comments