1
1
#include "Python.h"
2
+ #include "pycore_byteswap.h" // _Py_bswap32()
2
3
3
4
#include <ffi.h>
4
5
#ifdef MS_WIN32
@@ -448,46 +449,32 @@ get_ulonglong(PyObject *v, unsigned long long *p)
448
449
( ( (type)x & ~(BIT_MASK(type, size) << LOW_BIT(size)) ) | ( ((type)v & BIT_MASK(type, size)) << LOW_BIT(size) ) ) \
449
450
: (type)v)
450
451
451
- /* byte swapping macros */
452
- #define SWAP_2 (v ) \
453
- ( ( (v >> 8) & 0x00FF) | \
454
- ( (v << 8) & 0xFF00) )
455
-
456
- #define SWAP_4 (v ) \
457
- ( ( (v & 0x000000FF) << 24 ) | \
458
- ( (v & 0x0000FF00) << 8 ) | \
459
- ( (v & 0x00FF0000) >> 8 ) | \
460
- ( ((v >> 24) & 0xFF)) )
461
-
462
- #ifdef _MSC_VER
463
- #define SWAP_8 (v ) \
464
- ( ( (v & 0x00000000000000FFL) << 56 ) | \
465
- ( (v & 0x000000000000FF00L) << 40 ) | \
466
- ( (v & 0x0000000000FF0000L) << 24 ) | \
467
- ( (v & 0x00000000FF000000L) << 8 ) | \
468
- ( (v & 0x000000FF00000000L) >> 8 ) | \
469
- ( (v & 0x0000FF0000000000L) >> 24 ) | \
470
- ( (v & 0x00FF000000000000L) >> 40 ) | \
471
- ( ((v >> 56) & 0xFF)) )
452
+ #if SIZEOF_SHORT == 2
453
+ # define SWAP_SHORT _Py_bswap16
472
454
#else
473
- #define SWAP_8 (v ) \
474
- ( ( (v & 0x00000000000000FFLL) << 56 ) | \
475
- ( (v & 0x000000000000FF00LL) << 40 ) | \
476
- ( (v & 0x0000000000FF0000LL) << 24 ) | \
477
- ( (v & 0x00000000FF000000LL) << 8 ) | \
478
- ( (v & 0x000000FF00000000LL) >> 8 ) | \
479
- ( (v & 0x0000FF0000000000LL) >> 24 ) | \
480
- ( (v & 0x00FF000000000000LL) >> 40 ) | \
481
- ( ((v >> 56) & 0xFF)) )
455
+ # error "unsupported short size"
482
456
#endif
483
457
484
- #define SWAP_INT SWAP_4
458
+ #if SIZEOF_INT == 4
459
+ # define SWAP_INT _Py_bswap32
460
+ #else
461
+ # error "unsupported int size"
462
+ #endif
485
463
486
464
#if SIZEOF_LONG == 4
487
- # define SWAP_LONG SWAP_4
465
+ # define SWAP_LONG _Py_bswap32
488
466
#elif SIZEOF_LONG == 8
489
- # define SWAP_LONG SWAP_8
467
+ # define SWAP_LONG _Py_bswap64
468
+ #else
469
+ # error "unsupported long size"
470
+ #endif
471
+
472
+ #if SIZEOF_LONG_LONG == 8
473
+ # define SWAP_LONG_LONG _Py_bswap64
474
+ #else
475
+ # error "unsupported long long size"
490
476
#endif
477
+
491
478
/*****************************************************************
492
479
* The setter methods return an object which must be kept alive, to keep the
493
480
* data valid which has been stored in the memory block. The ctypes object
@@ -569,12 +556,13 @@ h_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
569
556
{
570
557
long val ;
571
558
short field ;
572
- if (get_long (value , & val ) < 0 )
559
+ if (get_long (value , & val ) < 0 ) {
573
560
return NULL ;
561
+ }
574
562
memcpy (& field , ptr , sizeof (field ));
575
- field = SWAP_2 (field );
563
+ field = SWAP_SHORT (field );
576
564
field = SET (short , field , val , size );
577
- field = SWAP_2 (field );
565
+ field = SWAP_SHORT (field );
578
566
memcpy (ptr , & field , sizeof (field ));
579
567
_RET (value );
580
568
}
@@ -593,7 +581,7 @@ h_get_sw(void *ptr, Py_ssize_t size)
593
581
{
594
582
short val ;
595
583
memcpy (& val , ptr , sizeof (val ));
596
- val = SWAP_2 (val );
584
+ val = SWAP_SHORT (val );
597
585
GET_BITFIELD (val , size );
598
586
return PyLong_FromLong (val );
599
587
}
@@ -616,12 +604,13 @@ H_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
616
604
{
617
605
unsigned long val ;
618
606
unsigned short field ;
619
- if (get_ulong (value , & val ) < 0 )
607
+ if (get_ulong (value , & val ) < 0 ) {
620
608
return NULL ;
609
+ }
621
610
memcpy (& field , ptr , sizeof (field ));
622
- field = SWAP_2 (field );
611
+ field = SWAP_SHORT (field );
623
612
field = SET (unsigned short , field , val , size );
624
- field = SWAP_2 (field );
613
+ field = SWAP_SHORT (field );
625
614
memcpy (ptr , & field , sizeof (field ));
626
615
_RET (value );
627
616
}
@@ -641,7 +630,7 @@ H_get_sw(void *ptr, Py_ssize_t size)
641
630
{
642
631
unsigned short val ;
643
632
memcpy (& val , ptr , sizeof (val ));
644
- val = SWAP_2 (val );
633
+ val = SWAP_SHORT (val );
645
634
GET_BITFIELD (val , size );
646
635
return PyLong_FromLong (val );
647
636
}
@@ -664,8 +653,9 @@ i_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
664
653
{
665
654
long val ;
666
655
int field ;
667
- if (get_long (value , & val ) < 0 )
656
+ if (get_long (value , & val ) < 0 ) {
668
657
return NULL ;
658
+ }
669
659
memcpy (& field , ptr , sizeof (field ));
670
660
field = SWAP_INT (field );
671
661
field = SET (int , field , val , size );
@@ -757,8 +747,9 @@ I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
757
747
{
758
748
unsigned long val ;
759
749
unsigned int field ;
760
- if (get_ulong (value , & val ) < 0 )
750
+ if (get_ulong (value , & val ) < 0 ) {
761
751
return NULL ;
752
+ }
762
753
memcpy (& field , ptr , sizeof (field ));
763
754
field = SWAP_INT (field );
764
755
field = SET (unsigned int , field , (unsigned int )val , size );
@@ -805,8 +796,9 @@ l_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
805
796
{
806
797
long val ;
807
798
long field ;
808
- if (get_long (value , & val ) < 0 )
799
+ if (get_long (value , & val ) < 0 ) {
809
800
return NULL ;
801
+ }
810
802
memcpy (& field , ptr , sizeof (field ));
811
803
field = SWAP_LONG (field );
812
804
field = SET (long , field , val , size );
@@ -853,8 +845,9 @@ L_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
853
845
{
854
846
unsigned long val ;
855
847
unsigned long field ;
856
- if (get_ulong (value , & val ) < 0 )
848
+ if (get_ulong (value , & val ) < 0 ) {
857
849
return NULL ;
850
+ }
858
851
memcpy (& field , ptr , sizeof (field ));
859
852
field = SWAP_LONG (field );
860
853
field = SET (unsigned long , field , val , size );
@@ -901,12 +894,13 @@ q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
901
894
{
902
895
long long val ;
903
896
long long field ;
904
- if (get_longlong (value , & val ) < 0 )
897
+ if (get_longlong (value , & val ) < 0 ) {
905
898
return NULL ;
899
+ }
906
900
memcpy (& field , ptr , sizeof (field ));
907
- field = SWAP_8 (field );
901
+ field = SWAP_LONG_LONG (field );
908
902
field = SET (long long , field , val , size );
909
- field = SWAP_8 (field );
903
+ field = SWAP_LONG_LONG (field );
910
904
memcpy (ptr , & field , sizeof (field ));
911
905
_RET (value );
912
906
}
@@ -925,7 +919,7 @@ q_get_sw(void *ptr, Py_ssize_t size)
925
919
{
926
920
long long val ;
927
921
memcpy (& val , ptr , sizeof (val ));
928
- val = SWAP_8 (val );
922
+ val = SWAP_LONG_LONG (val );
929
923
GET_BITFIELD (val , size );
930
924
return PyLong_FromLongLong (val );
931
925
}
@@ -948,12 +942,13 @@ Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
948
942
{
949
943
unsigned long long val ;
950
944
unsigned long long field ;
951
- if (get_ulonglong (value , & val ) < 0 )
945
+ if (get_ulonglong (value , & val ) < 0 ) {
952
946
return NULL ;
947
+ }
953
948
memcpy (& field , ptr , sizeof (field ));
954
- field = SWAP_8 (field );
949
+ field = SWAP_LONG_LONG (field );
955
950
field = SET (unsigned long long, field , val , size );
956
- field = SWAP_8 (field );
951
+ field = SWAP_LONG_LONG (field );
957
952
memcpy (ptr , & field , sizeof (field ));
958
953
_RET (value );
959
954
}
@@ -972,7 +967,7 @@ Q_get_sw(void *ptr, Py_ssize_t size)
972
967
{
973
968
unsigned long long val ;
974
969
memcpy (& val , ptr , sizeof (val ));
975
- val = SWAP_8 (val );
970
+ val = SWAP_LONG_LONG (val );
976
971
GET_BITFIELD (val , size );
977
972
return PyLong_FromUnsignedLongLong (val );
978
973
}
0 commit comments