1
1
// SPDX-License-Identifier: (Apache-2.0 OR MIT)
2
2
3
- use crate :: deserialize:: pyobject:: * ;
3
+ use crate :: deserialize:: pyobject:: {
4
+ get_unicode_key, parse_f64, parse_false, parse_i64, parse_none, parse_true, parse_u64,
5
+ } ;
4
6
use crate :: deserialize:: DeserializeError ;
5
- use crate :: ffi:: yyjson:: * ;
7
+ use crate :: ffi:: yyjson:: {
8
+ yyjson_doc, yyjson_doc_free, yyjson_read_err, yyjson_read_opts, yyjson_val, YYJSON_READ_SUCCESS ,
9
+ } ;
6
10
use crate :: str:: unicode_from_str;
7
11
use crate :: typeref:: { yyjson_init, YYJSON_ALLOC , YYJSON_BUFFER_SIZE } ;
12
+ use crate :: util:: usize_to_isize;
13
+
8
14
use core:: ffi:: c_char;
9
15
use core:: ptr:: { null, null_mut, NonNull } ;
10
16
use std:: borrow:: Cow ;
@@ -49,12 +55,14 @@ fn unsafe_yyjson_is_ctn(val: *mut yyjson_val) -> bool {
49
55
unsafe { ( * val) . tag as u8 & 0b00000110 == 0b00000110 }
50
56
}
51
57
58
+ #[ allow( clippy:: cast_ptr_alignment) ]
52
59
fn unsafe_yyjson_get_next_container ( val : * mut yyjson_val ) -> * mut yyjson_val {
53
- unsafe { ( ( val as * mut u8 ) . add ( ( * val) . uni . ofs ) ) as * mut yyjson_val }
60
+ unsafe { ( val. cast :: < u8 > ( ) . add ( ( * val) . uni . ofs ) ) . cast :: < yyjson_val > ( ) }
54
61
}
55
62
63
+ #[ allow( clippy:: cast_ptr_alignment) ]
56
64
fn unsafe_yyjson_get_next_non_container ( val : * mut yyjson_val ) -> * mut yyjson_val {
57
- unsafe { ( ( val as * mut u8 ) . add ( YYJSON_VAL_SIZE ) ) as * mut yyjson_val }
65
+ unsafe { ( val. cast :: < u8 > ( ) . add ( YYJSON_VAL_SIZE ) ) . cast :: < yyjson_val > ( ) }
58
66
}
59
67
60
68
pub ( crate ) fn deserialize (
@@ -91,16 +99,16 @@ pub(crate) fn deserialize(
91
99
unsafe { yyjson_doc_free ( doc) } ;
92
100
Ok ( pyval)
93
101
} else if is_yyjson_tag ! ( val, TAG_ARRAY ) {
94
- let pyval = nonnull ! ( ffi!( PyList_New ( unsafe_yyjson_get_len( val) as isize ) ) ) ;
102
+ let pyval = nonnull ! ( ffi!( PyList_New ( usize_to_isize ( unsafe_yyjson_get_len( val) ) ) ) ) ;
95
103
if unsafe_yyjson_get_len ( val) > 0 {
96
104
populate_yy_array ( pyval. as_ptr ( ) , val) ;
97
105
}
98
106
unsafe { yyjson_doc_free ( doc) } ;
99
107
Ok ( pyval)
100
108
} else {
101
- let pyval = nonnull ! ( ffi!( _PyDict_NewPresized(
102
- unsafe_yyjson_get_len( val) as isize
103
- ) ) ) ;
109
+ let pyval = nonnull ! ( ffi!( _PyDict_NewPresized( usize_to_isize (
110
+ unsafe_yyjson_get_len( val)
111
+ ) ) ) ) ;
104
112
if unsafe_yyjson_get_len ( val) > 0 {
105
113
populate_yy_object ( pyval. as_ptr ( ) , val) ;
106
114
}
@@ -157,7 +165,7 @@ impl ElementType {
157
165
#[ inline( always) ]
158
166
fn parse_yy_string ( elem : * mut yyjson_val ) -> NonNull < pyo3_ffi:: PyObject > {
159
167
nonnull ! ( unicode_from_str( str_from_slice!(
160
- ( * elem) . uni. str_ as * const u8 ,
168
+ ( * elem) . uni. str_. cast :: < u8 > ( ) ,
161
169
unsafe_yyjson_get_len( elem)
162
170
) ) )
163
171
}
@@ -192,20 +200,22 @@ fn populate_yy_array(list: *mut pyo3_ffi::PyObject, elem: *mut yyjson_val) {
192
200
let len = unsafe_yyjson_get_len ( elem) ;
193
201
assume ! ( len >= 1 ) ;
194
202
let mut next = unsafe_yyjson_get_first ( elem) ;
195
- let mut dptr = ( * ( list as * mut pyo3_ffi:: PyListObject ) ) . ob_item ;
203
+ let mut dptr = ( * list. cast :: < pyo3_ffi:: PyListObject > ( ) ) . ob_item ;
196
204
197
205
for _ in 0 ..len {
198
206
let val = next;
199
207
if unlikely ! ( unsafe_yyjson_is_ctn( val) ) {
200
208
next = unsafe_yyjson_get_next_container ( val) ;
201
209
if is_yyjson_tag ! ( val, TAG_ARRAY ) {
202
- let pyval = ffi ! ( PyList_New ( unsafe_yyjson_get_len( val) as isize ) ) ;
210
+ let pyval = ffi ! ( PyList_New ( usize_to_isize ( unsafe_yyjson_get_len( val) ) ) ) ;
203
211
append_to_list ! ( dptr, pyval) ;
204
212
if unsafe_yyjson_get_len ( val) > 0 {
205
213
populate_yy_array ( pyval, val) ;
206
214
}
207
215
} else {
208
- let pyval = ffi ! ( _PyDict_NewPresized( unsafe_yyjson_get_len( val) as isize ) ) ;
216
+ let pyval = ffi ! ( _PyDict_NewPresized( usize_to_isize( unsafe_yyjson_get_len(
217
+ val
218
+ ) ) ) ) ;
209
219
append_to_list ! ( dptr, pyval) ;
210
220
if unsafe_yyjson_get_len ( val) > 0 {
211
221
populate_yy_object ( pyval, val) ;
@@ -241,7 +251,7 @@ fn populate_yy_object(dict: *mut pyo3_ffi::PyObject, elem: *mut yyjson_val) {
241
251
let val = next_val;
242
252
let pykey = {
243
253
let key_str = str_from_slice ! (
244
- ( * next_key) . uni. str_ as * const u8 ,
254
+ ( * next_key) . uni. str_. cast :: < u8 > ( ) ,
245
255
unsafe_yyjson_get_len( next_key)
246
256
) ;
247
257
get_unicode_key ( key_str)
@@ -250,13 +260,15 @@ fn populate_yy_object(dict: *mut pyo3_ffi::PyObject, elem: *mut yyjson_val) {
250
260
next_key = unsafe_yyjson_get_next_container ( val) ;
251
261
next_val = next_key. add ( 1 ) ;
252
262
if is_yyjson_tag ! ( val, TAG_ARRAY ) {
253
- let pyval = ffi ! ( PyList_New ( unsafe_yyjson_get_len( val) as isize ) ) ;
263
+ let pyval = ffi ! ( PyList_New ( usize_to_isize ( unsafe_yyjson_get_len( val) ) ) ) ;
254
264
pydict_setitem ! ( dict, pykey, pyval) ;
255
265
if unsafe_yyjson_get_len ( val) > 0 {
256
266
populate_yy_array ( pyval, val) ;
257
267
}
258
268
} else {
259
- let pyval = ffi ! ( _PyDict_NewPresized( unsafe_yyjson_get_len( val) as isize ) ) ;
269
+ let pyval = ffi ! ( _PyDict_NewPresized( usize_to_isize( unsafe_yyjson_get_len(
270
+ val
271
+ ) ) ) ) ;
260
272
pydict_setitem ! ( dict, pykey, pyval) ;
261
273
if unsafe_yyjson_get_len ( val) > 0 {
262
274
populate_yy_object ( pyval, val) ;
0 commit comments