@@ -430,12 +430,8 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
430
430
#define LOW_BIT (x ) ((x) & 0xFFFF)
431
431
#define NUM_BITS (x ) ((x) >> 16)
432
432
433
- /* This seems nore a compiler issue than a Windows/non-Windows one */
434
- #ifdef MS_WIN32
435
- # define BIT_MASK (size ) ((1 << NUM_BITS(size))-1)
436
- #else
437
- # define BIT_MASK (size ) ((1LL << NUM_BITS(size))-1)
438
- #endif
433
+ /* Doesn't work if NUM_BITS(size) == 0, but it never happens in SET() call. */
434
+ #define BIT_MASK (type , size ) (((((type)1 << (NUM_BITS(size) - 1)) - 1) << 1) + 1)
439
435
440
436
/* This macro CHANGES the first parameter IN PLACE. For proper sign handling,
441
437
we must first shift left, then right.
@@ -447,10 +443,10 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
447
443
}
448
444
449
445
/* This macro RETURNS the first parameter with the bit field CHANGED. */
450
- #define SET (x , v , size ) \
446
+ #define SET (type , x , v , size ) \
451
447
(NUM_BITS(size) ? \
452
- ( ( x & ~(BIT_MASK(size) << LOW_BIT(size)) ) | ( (v & BIT_MASK(size)) << LOW_BIT(size) ) ) \
453
- : v)
448
+ ( ( (type) x & ~(BIT_MASK(type, size) << LOW_BIT(size)) ) | ( ((type) v & BIT_MASK(type, size)) << LOW_BIT(size) ) ) \
449
+ : (type) v)
454
450
455
451
/* byte swapping macros */
456
452
#define SWAP_2 (v ) \
@@ -522,7 +518,7 @@ b_set(void *ptr, PyObject *value, Py_ssize_t size)
522
518
long val ;
523
519
if (get_long (value , & val ) < 0 )
524
520
return NULL ;
525
- * (signed char * )ptr = (signed char ) SET ( * (signed char * )ptr , ( signed char ) val , size );
521
+ * (signed char * )ptr = SET (signed char , * (signed char * )ptr , val , size );
526
522
_RET (value );
527
523
}
528
524
@@ -541,8 +537,7 @@ B_set(void *ptr, PyObject *value, Py_ssize_t size)
541
537
unsigned long val ;
542
538
if (get_ulong (value , & val ) < 0 )
543
539
return NULL ;
544
- * (unsigned char * )ptr = (unsigned char )SET (* (unsigned char * )ptr ,
545
- (unsigned short )val , size );
540
+ * (unsigned char * )ptr = SET (unsigned char , * (unsigned char * )ptr , val , size );
546
541
_RET (value );
547
542
}
548
543
@@ -563,7 +558,7 @@ h_set(void *ptr, PyObject *value, Py_ssize_t size)
563
558
if (get_long (value , & val ) < 0 )
564
559
return NULL ;
565
560
memcpy (& x , ptr , sizeof (x ));
566
- x = SET (x , ( short ) val , size );
561
+ x = SET (short , x , val , size );
567
562
memcpy (ptr , & x , sizeof (x ));
568
563
_RET (value );
569
564
}
@@ -578,7 +573,7 @@ h_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
578
573
return NULL ;
579
574
memcpy (& field , ptr , sizeof (field ));
580
575
field = SWAP_2 (field );
581
- field = SET (field , ( short ) val , size );
576
+ field = SET (short , field , val , size );
582
577
field = SWAP_2 (field );
583
578
memcpy (ptr , & field , sizeof (field ));
584
579
_RET (value );
@@ -611,7 +606,7 @@ H_set(void *ptr, PyObject *value, Py_ssize_t size)
611
606
if (get_ulong (value , & val ) < 0 )
612
607
return NULL ;
613
608
memcpy (& x , ptr , sizeof (x ));
614
- x = SET (x , ( unsigned short ) val , size );
609
+ x = SET (unsigned short , x , val , size );
615
610
memcpy (ptr , & x , sizeof (x ));
616
611
_RET (value );
617
612
}
@@ -625,7 +620,7 @@ H_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
625
620
return NULL ;
626
621
memcpy (& field , ptr , sizeof (field ));
627
622
field = SWAP_2 (field );
628
- field = SET (field , ( unsigned short ) val , size );
623
+ field = SET (unsigned short , field , val , size );
629
624
field = SWAP_2 (field );
630
625
memcpy (ptr , & field , sizeof (field ));
631
626
_RET (value );
@@ -659,7 +654,7 @@ i_set(void *ptr, PyObject *value, Py_ssize_t size)
659
654
if (get_long (value , & val ) < 0 )
660
655
return NULL ;
661
656
memcpy (& x , ptr , sizeof (x ));
662
- x = SET (x , ( int ) val , size );
657
+ x = SET (int , x , val , size );
663
658
memcpy (ptr , & x , sizeof (x ));
664
659
_RET (value );
665
660
}
@@ -673,7 +668,7 @@ i_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
673
668
return NULL ;
674
669
memcpy (& field , ptr , sizeof (field ));
675
670
field = SWAP_INT (field );
676
- field = SET (field , ( int ) val , size );
671
+ field = SET (int , field , val , size );
677
672
field = SWAP_INT (field );
678
673
memcpy (ptr , & field , sizeof (field ));
679
674
_RET (value );
@@ -760,7 +755,7 @@ I_set(void *ptr, PyObject *value, Py_ssize_t size)
760
755
if (get_ulong (value , & val ) < 0 )
761
756
return NULL ;
762
757
memcpy (& x , ptr , sizeof (x ));
763
- x = SET (x , ( unsigned int ) val , size );
758
+ x = SET (unsigned int , x , val , size );
764
759
memcpy (ptr , & x , sizeof (x ));
765
760
_RET (value );
766
761
}
@@ -773,7 +768,7 @@ I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
773
768
if (get_ulong (value , & val ) < 0 )
774
769
return NULL ;
775
770
memcpy (& field , ptr , sizeof (field ));
776
- field = (unsigned int ) SET ( field , (unsigned int )val , size );
771
+ field = SET (unsigned int , field , (unsigned int )val , size );
777
772
field = SWAP_INT (field );
778
773
memcpy (ptr , & field , sizeof (field ));
779
774
_RET (value );
@@ -807,7 +802,7 @@ l_set(void *ptr, PyObject *value, Py_ssize_t size)
807
802
if (get_long (value , & val ) < 0 )
808
803
return NULL ;
809
804
memcpy (& x , ptr , sizeof (x ));
810
- x = SET (x , val , size );
805
+ x = SET (long , x , val , size );
811
806
memcpy (ptr , & x , sizeof (x ));
812
807
_RET (value );
813
808
}
@@ -821,7 +816,7 @@ l_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
821
816
return NULL ;
822
817
memcpy (& field , ptr , sizeof (field ));
823
818
field = SWAP_LONG (field );
824
- field = ( long ) SET (field , val , size );
819
+ field = SET (long , field , val , size );
825
820
field = SWAP_LONG (field );
826
821
memcpy (ptr , & field , sizeof (field ));
827
822
_RET (value );
@@ -855,7 +850,7 @@ L_set(void *ptr, PyObject *value, Py_ssize_t size)
855
850
if (get_ulong (value , & val ) < 0 )
856
851
return NULL ;
857
852
memcpy (& x , ptr , sizeof (x ));
858
- x = SET (x , val , size );
853
+ x = SET (unsigned long , x , val , size );
859
854
memcpy (ptr , & x , sizeof (x ));
860
855
_RET (value );
861
856
}
@@ -869,7 +864,7 @@ L_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
869
864
return NULL ;
870
865
memcpy (& field , ptr , sizeof (field ));
871
866
field = SWAP_LONG (field );
872
- field = (unsigned long ) SET ( field , val , size );
867
+ field = SET (unsigned long , field , val , size );
873
868
field = SWAP_LONG (field );
874
869
memcpy (ptr , & field , sizeof (field ));
875
870
_RET (value );
@@ -904,7 +899,7 @@ q_set(void *ptr, PyObject *value, Py_ssize_t size)
904
899
if (get_longlong (value , & val ) < 0 )
905
900
return NULL ;
906
901
memcpy (& x , ptr , sizeof (x ));
907
- x = SET (x , val , size );
902
+ x = SET (PY_LONG_LONG , x , val , size );
908
903
memcpy (ptr , & x , sizeof (x ));
909
904
_RET (value );
910
905
}
@@ -918,7 +913,7 @@ q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
918
913
return NULL ;
919
914
memcpy (& field , ptr , sizeof (field ));
920
915
field = SWAP_8 (field );
921
- field = ( PY_LONG_LONG ) SET (field , val , size );
916
+ field = SET (PY_LONG_LONG , field , val , size );
922
917
field = SWAP_8 (field );
923
918
memcpy (ptr , & field , sizeof (field ));
924
919
_RET (value );
@@ -951,7 +946,7 @@ Q_set(void *ptr, PyObject *value, Py_ssize_t size)
951
946
if (get_ulonglong (value , & val ) < 0 )
952
947
return NULL ;
953
948
memcpy (& x , ptr , sizeof (x ));
954
- x = SET (x , val , size );
949
+ x = SET (PY_LONG_LONG , x , val , size );
955
950
memcpy (ptr , & x , sizeof (x ));
956
951
_RET (value );
957
952
}
@@ -965,7 +960,7 @@ Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
965
960
return NULL ;
966
961
memcpy (& field , ptr , sizeof (field ));
967
962
field = SWAP_8 (field );
968
- field = (unsigned PY_LONG_LONG ) SET ( field , val , size );
963
+ field = SET (unsigned PY_LONG_LONG , field , val , size );
969
964
field = SWAP_8 (field );
970
965
memcpy (ptr , & field , sizeof (field ));
971
966
_RET (value );
0 commit comments