@@ -430,12 +430,8 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
430430#define LOW_BIT (x ) ((x) & 0xFFFF)
431431#define NUM_BITS (x ) ((x) >> 16)
432432
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)
439435
440436/* This macro CHANGES the first parameter IN PLACE. For proper sign handling,
441437 we must first shift left, then right.
@@ -447,10 +443,10 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
447443 }
448444
449445/* This macro RETURNS the first parameter with the bit field CHANGED. */
450- #define SET (x , v , size ) \
446+ #define SET (type , x , v , size ) \
451447 (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)
454450
455451/* byte swapping macros */
456452#define SWAP_2 (v ) \
@@ -522,7 +518,7 @@ b_set(void *ptr, PyObject *value, Py_ssize_t size)
522518 long val ;
523519 if (get_long (value , & val ) < 0 )
524520 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 );
526522 _RET (value );
527523}
528524
@@ -541,8 +537,7 @@ B_set(void *ptr, PyObject *value, Py_ssize_t size)
541537 unsigned long val ;
542538 if (get_ulong (value , & val ) < 0 )
543539 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 );
546541 _RET (value );
547542}
548543
@@ -563,7 +558,7 @@ h_set(void *ptr, PyObject *value, Py_ssize_t size)
563558 if (get_long (value , & val ) < 0 )
564559 return NULL ;
565560 memcpy (& x , ptr , sizeof (x ));
566- x = SET (x , ( short ) val , size );
561+ x = SET (short , x , val , size );
567562 memcpy (ptr , & x , sizeof (x ));
568563 _RET (value );
569564}
@@ -578,7 +573,7 @@ h_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
578573 return NULL ;
579574 memcpy (& field , ptr , sizeof (field ));
580575 field = SWAP_2 (field );
581- field = SET (field , ( short ) val , size );
576+ field = SET (short , field , val , size );
582577 field = SWAP_2 (field );
583578 memcpy (ptr , & field , sizeof (field ));
584579 _RET (value );
@@ -611,7 +606,7 @@ H_set(void *ptr, PyObject *value, Py_ssize_t size)
611606 if (get_ulong (value , & val ) < 0 )
612607 return NULL ;
613608 memcpy (& x , ptr , sizeof (x ));
614- x = SET (x , ( unsigned short ) val , size );
609+ x = SET (unsigned short , x , val , size );
615610 memcpy (ptr , & x , sizeof (x ));
616611 _RET (value );
617612}
@@ -625,7 +620,7 @@ H_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
625620 return NULL ;
626621 memcpy (& field , ptr , sizeof (field ));
627622 field = SWAP_2 (field );
628- field = SET (field , ( unsigned short ) val , size );
623+ field = SET (unsigned short , field , val , size );
629624 field = SWAP_2 (field );
630625 memcpy (ptr , & field , sizeof (field ));
631626 _RET (value );
@@ -659,7 +654,7 @@ i_set(void *ptr, PyObject *value, Py_ssize_t size)
659654 if (get_long (value , & val ) < 0 )
660655 return NULL ;
661656 memcpy (& x , ptr , sizeof (x ));
662- x = SET (x , ( int ) val , size );
657+ x = SET (int , x , val , size );
663658 memcpy (ptr , & x , sizeof (x ));
664659 _RET (value );
665660}
@@ -673,7 +668,7 @@ i_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
673668 return NULL ;
674669 memcpy (& field , ptr , sizeof (field ));
675670 field = SWAP_INT (field );
676- field = SET (field , ( int ) val , size );
671+ field = SET (int , field , val , size );
677672 field = SWAP_INT (field );
678673 memcpy (ptr , & field , sizeof (field ));
679674 _RET (value );
@@ -760,7 +755,7 @@ I_set(void *ptr, PyObject *value, Py_ssize_t size)
760755 if (get_ulong (value , & val ) < 0 )
761756 return NULL ;
762757 memcpy (& x , ptr , sizeof (x ));
763- x = SET (x , ( unsigned int ) val , size );
758+ x = SET (unsigned int , x , val , size );
764759 memcpy (ptr , & x , sizeof (x ));
765760 _RET (value );
766761}
@@ -773,7 +768,7 @@ I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
773768 if (get_ulong (value , & val ) < 0 )
774769 return NULL ;
775770 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 );
777772 field = SWAP_INT (field );
778773 memcpy (ptr , & field , sizeof (field ));
779774 _RET (value );
@@ -807,7 +802,7 @@ l_set(void *ptr, PyObject *value, Py_ssize_t size)
807802 if (get_long (value , & val ) < 0 )
808803 return NULL ;
809804 memcpy (& x , ptr , sizeof (x ));
810- x = SET (x , val , size );
805+ x = SET (long , x , val , size );
811806 memcpy (ptr , & x , sizeof (x ));
812807 _RET (value );
813808}
@@ -821,7 +816,7 @@ l_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
821816 return NULL ;
822817 memcpy (& field , ptr , sizeof (field ));
823818 field = SWAP_LONG (field );
824- field = ( long ) SET (field , val , size );
819+ field = SET (long , field , val , size );
825820 field = SWAP_LONG (field );
826821 memcpy (ptr , & field , sizeof (field ));
827822 _RET (value );
@@ -855,7 +850,7 @@ L_set(void *ptr, PyObject *value, Py_ssize_t size)
855850 if (get_ulong (value , & val ) < 0 )
856851 return NULL ;
857852 memcpy (& x , ptr , sizeof (x ));
858- x = SET (x , val , size );
853+ x = SET (unsigned long , x , val , size );
859854 memcpy (ptr , & x , sizeof (x ));
860855 _RET (value );
861856}
@@ -869,7 +864,7 @@ L_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
869864 return NULL ;
870865 memcpy (& field , ptr , sizeof (field ));
871866 field = SWAP_LONG (field );
872- field = (unsigned long ) SET ( field , val , size );
867+ field = SET (unsigned long , field , val , size );
873868 field = SWAP_LONG (field );
874869 memcpy (ptr , & field , sizeof (field ));
875870 _RET (value );
@@ -904,7 +899,7 @@ q_set(void *ptr, PyObject *value, Py_ssize_t size)
904899 if (get_longlong (value , & val ) < 0 )
905900 return NULL ;
906901 memcpy (& x , ptr , sizeof (x ));
907- x = SET (x , val , size );
902+ x = SET (PY_LONG_LONG , x , val , size );
908903 memcpy (ptr , & x , sizeof (x ));
909904 _RET (value );
910905}
@@ -918,7 +913,7 @@ q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
918913 return NULL ;
919914 memcpy (& field , ptr , sizeof (field ));
920915 field = SWAP_8 (field );
921- field = ( PY_LONG_LONG ) SET (field , val , size );
916+ field = SET (PY_LONG_LONG , field , val , size );
922917 field = SWAP_8 (field );
923918 memcpy (ptr , & field , sizeof (field ));
924919 _RET (value );
@@ -951,7 +946,7 @@ Q_set(void *ptr, PyObject *value, Py_ssize_t size)
951946 if (get_ulonglong (value , & val ) < 0 )
952947 return NULL ;
953948 memcpy (& x , ptr , sizeof (x ));
954- x = SET (x , val , size );
949+ x = SET (PY_LONG_LONG , x , val , size );
955950 memcpy (ptr , & x , sizeof (x ));
956951 _RET (value );
957952}
@@ -965,7 +960,7 @@ Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
965960 return NULL ;
966961 memcpy (& field , ptr , sizeof (field ));
967962 field = SWAP_8 (field );
968- field = (unsigned PY_LONG_LONG ) SET ( field , val , size );
963+ field = SET (unsigned PY_LONG_LONG , field , val , size );
969964 field = SWAP_8 (field );
970965 memcpy (ptr , & field , sizeof (field ));
971966 _RET (value );
0 commit comments