@@ -49,7 +49,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
49
49
ptr : Scalar < Tag > ,
50
50
) -> InterpResult < ' tcx > {
51
51
let this = self . eval_context_mut ( ) ;
52
- if !ptr . is_null_ptr ( this ) {
52
+ if !this . is_null ( ptr ) ? {
53
53
let ptr = this. force_ptr ( ptr) ?;
54
54
this. memory_mut ( ) . deallocate (
55
55
ptr,
@@ -67,7 +67,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
67
67
) -> InterpResult < ' tcx , Scalar < Tag > > {
68
68
let this = self . eval_context_mut ( ) ;
69
69
let align = this. min_align ( ) ;
70
- if old_ptr . is_null_ptr ( this ) {
70
+ if this . is_null ( old_ptr ) ? {
71
71
if new_size == 0 {
72
72
Ok ( Scalar :: from_int ( 0 , this. pointer_size ( ) ) )
73
73
} else {
@@ -429,7 +429,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
429
429
let mut success = None ;
430
430
{
431
431
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 ) ? {
433
433
let name_ptr = name_ptr. to_ptr ( ) ?;
434
434
let name = this
435
435
. memory ( )
@@ -457,7 +457,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
457
457
let name_ptr = this. read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?;
458
458
let value_ptr = this. read_scalar ( args[ 1 ] ) ?. to_ptr ( ) ?;
459
459
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 ) ? {
461
461
let name_ptr = name_ptr. to_ptr ( ) ?;
462
462
let name = this. memory ( ) . get ( name_ptr. alloc_id ) ?. read_c_str ( tcx, name_ptr) ?;
463
463
if !name. is_empty ( ) && !name. contains ( & b'=' ) {
@@ -640,14 +640,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
640
640
let key_ptr = this. read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?;
641
641
642
642
// 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 ,
651
646
} ;
652
647
653
648
// Figure out how large a pthread TLS key actually is.
@@ -659,7 +654,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
659
654
let key_layout = this. layout_of ( key_type) ?;
660
655
661
656
// 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 ;
663
658
if key_layout. size . bits ( ) < 128 && key >= ( 1u128 << key_layout. size . bits ( ) as u128 ) {
664
659
return err ! ( OutOfTls ) ;
665
660
}
@@ -684,13 +679,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
684
679
}
685
680
"pthread_getspecific" => {
686
681
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 ) ?;
688
683
this. write_scalar ( ptr, dest) ?;
689
684
}
690
685
"pthread_setspecific" => {
691
686
let key = this. read_scalar ( args[ 0 ] ) ?. to_bits ( args[ 0 ] . layout . size ) ?;
692
687
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) ? ) ?;
694
689
695
690
// Return success (`0`).
696
691
this. write_null ( dest) ?;
@@ -844,7 +839,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
844
839
// This just creates a key; Windows does not natively support TLS destructors.
845
840
846
841
// 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 ;
848
843
849
844
// Figure out how large a TLS key actually is. This is `c::DWORD`.
850
845
if dest. layout . size . bits ( ) < 128
@@ -855,13 +850,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
855
850
}
856
851
"TlsGetValue" => {
857
852
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 ) ?;
859
854
this. write_scalar ( ptr, dest) ?;
860
855
}
861
856
"TlsSetValue" => {
862
857
let key = this. read_scalar ( args[ 0 ] ) ?. to_u32 ( ) ? as u128 ;
863
858
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) ? ) ?;
865
860
866
861
// Return success (`1`).
867
862
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
938
933
Ok ( ( ) )
939
934
}
940
935
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
-
945
936
/// Evaluates the scalar at the specified path. Returns Some(val)
946
937
/// if the path could be resolved, and None otherwise
947
938
fn eval_path_scalar ( & mut self , path : & [ & str ] ) -> InterpResult < ' tcx , Option < ScalarMaybeUndef < Tag > > > {
0 commit comments