File tree Expand file tree Collapse file tree 3 files changed +39
-5
lines changed
include/pyo3/pyo3-ffi/src/cpython Expand file tree Collapse file tree 3 files changed +39
-5
lines changed Original file line number Diff line number Diff line change @@ -61,6 +61,18 @@ extern "C" {
61
61
is_signed : c_int ,
62
62
) -> * mut PyObject ;
63
63
64
+ #[ cfg( Py_3_13 ) ]
65
+ #[ cfg_attr( PyPy , link_name = "_PyPyLong_AsByteArrayO" ) ]
66
+ pub fn _PyLong_AsByteArray (
67
+ v : * mut PyLongObject ,
68
+ bytes : * mut c_uchar ,
69
+ n : size_t ,
70
+ little_endian : c_int ,
71
+ is_signed : c_int ,
72
+ with_exceptions : c_int ,
73
+ ) -> c_int ;
74
+
75
+ #[ cfg( not( Py_3_13 ) ) ]
64
76
#[ cfg_attr( PyPy , link_name = "_PyPyLong_AsByteArrayO" ) ]
65
77
pub fn _PyLong_AsByteArray (
66
78
v : * mut PyLongObject ,
Original file line number Diff line number Diff line change @@ -44,27 +44,39 @@ impl Serialize for IntSerializer {
44
44
}
45
45
} else {
46
46
let mut buffer: [ u8 ; 8 ] = [ 0 ; 8 ] ;
47
+
48
+ #[ cfg( not( Py_3_13 ) ) ]
49
+ let ret = pyo3_ffi:: _PyLong_AsByteArray (
50
+ self . ptr . cast :: < pyo3_ffi:: PyLongObject > ( ) ,
51
+ buffer. as_mut_ptr ( ) . cast :: < core:: ffi:: c_uchar > ( ) ,
52
+ 8 ,
53
+ 1 ,
54
+ is_signed,
55
+ ) ;
56
+ #[ cfg( Py_3_13 ) ]
47
57
let ret = pyo3_ffi:: _PyLong_AsByteArray (
48
58
self . ptr . cast :: < pyo3_ffi:: PyLongObject > ( ) ,
49
59
buffer. as_mut_ptr ( ) . cast :: < core:: ffi:: c_uchar > ( ) ,
50
60
8 ,
51
61
1 ,
52
62
is_signed,
63
+ 0 ,
53
64
) ;
54
65
if unlikely ! ( ret == -1 ) {
66
+ #[ cfg( not( Py_3_13 ) ) ]
55
67
ffi ! ( PyErr_Clear ( ) ) ;
56
68
err ! ( SerializeError :: Integer64Bits )
57
69
}
58
70
if is_signed == 0 {
59
- let val = core :: mem :: transmute :: < [ u8 ; 8 ] , u64 > ( buffer) ;
71
+ let val = u64 :: from_ne_bytes ( buffer) ;
60
72
if unlikely ! ( opt_enabled!( self . opts, STRICT_INTEGER ) )
61
73
&& val > STRICT_INT_MAX as u64
62
74
{
63
75
err ! ( SerializeError :: Integer53Bits )
64
76
}
65
77
serializer. serialize_u64 ( val)
66
78
} else {
67
- let val = core :: mem :: transmute :: < [ u8 ; 8 ] , i64 > ( buffer) ;
79
+ let val = i64 :: from_ne_bytes ( buffer) ;
68
80
if unlikely ! ( opt_enabled!( self . opts, STRICT_INTEGER ) )
69
81
&& !( STRICT_INT_MIN ..=STRICT_INT_MAX ) . contains ( & val)
70
82
{
Original file line number Diff line number Diff line change @@ -22,16 +22,26 @@ impl UUID {
22
22
// test_uuid_immutable, test_uuid_int
23
23
let py_int = ffi ! ( PyObject_GetAttr ( self . ptr, INT_ATTR_STR ) ) ;
24
24
ffi ! ( Py_DECREF ( py_int) ) ;
25
- let buffer: [ c_uchar ; 16 ] = [ 0 ; 16 ] ;
25
+ let mut buffer: [ c_uchar ; 16 ] = [ 0 ; 16 ] ;
26
26
unsafe {
27
27
// test_uuid_overflow
28
+ #[ cfg( not( Py_3_13 ) ) ]
28
29
pyo3_ffi:: _PyLong_AsByteArray (
29
30
py_int. cast :: < pyo3_ffi:: PyLongObject > ( ) ,
30
- buffer. as_ptr ( ) . cast_mut ( ) ,
31
+ buffer. as_mut_ptr ( ) ,
31
32
16 ,
32
33
1 , // little_endian
33
34
0 , // is_signed
34
- )
35
+ ) ;
36
+ #[ cfg( Py_3_13 ) ]
37
+ pyo3_ffi:: _PyLong_AsByteArray (
38
+ py_int. cast :: < pyo3_ffi:: PyLongObject > ( ) ,
39
+ buffer. as_mut_ptr ( ) ,
40
+ 16 ,
41
+ 1 , // little_endian
42
+ 0 , // is_signed
43
+ 0 ,
44
+ ) ;
35
45
} ;
36
46
value = u128:: from_le_bytes ( buffer) ;
37
47
}
You can’t perform that action at this time.
0 commit comments