11// SPDX-License-Identifier: (Apache-2.0 OR MIT)
22
3+ use crate :: bytes:: * ;
34use crate :: exc:: * ;
45use crate :: typeref:: * ;
6+ use crate :: unicode:: * ;
57use associative_cache:: replacement:: RoundRobinReplacement ;
68use associative_cache:: * ;
79use lazy_static:: lazy_static;
@@ -50,31 +52,31 @@ lazy_static! {
5052}
5153
5254pub fn deserialize ( ptr : * mut pyo3:: ffi:: PyObject ) -> PyResult < NonNull < pyo3:: ffi:: PyObject > > {
55+ let data: & str ;
5356 let obj_type_ptr = unsafe { ( * ptr) . ob_type } ;
54- let data: Cow < str > ;
5557 if is_type ! ( obj_type_ptr, STR_PTR ) {
5658 let mut str_size: pyo3:: ffi:: Py_ssize_t = 0 ;
57- let uni = ffi ! ( PyUnicode_AsUTF8AndSize ( ptr, & mut str_size) ) as * const u8 ;
59+ let uni = read_utf8_from_str ( ptr, & mut str_size) ;
5860 if unlikely ! ( uni. is_null( ) ) {
5961 return Err ( JSONDecodeError :: py_err ( ( INVALID_STR , "" , 0 ) ) ) ;
6062 }
61- data = Cow :: Borrowed ( str_from_slice ! ( uni, str_size) ) ;
63+ data = str_from_slice ! ( uni, str_size) ;
6264 } else if is_type ! ( obj_type_ptr, BYTES_PTR ) {
63- let buffer = ffi ! ( PyBytes_AsString ( ptr) ) as * const u8 ;
64- let length = ffi ! ( PyBytes_Size ( ptr) ) as usize ;
65+ let buffer = unsafe { PyBytes_AS_STRING ( ptr) as * const u8 } ;
66+ let length = unsafe { PyBytes_GET_SIZE ( ptr) as usize } ;
6567 let slice = unsafe { std:: slice:: from_raw_parts ( buffer, length) } ;
6668 if encoding_rs:: Encoding :: utf8_valid_up_to ( slice) != length {
6769 return Err ( JSONDecodeError :: py_err ( ( INVALID_STR , "" , 0 ) ) ) ;
6870 }
69- data = Cow :: Borrowed ( unsafe { std:: str:: from_utf8_unchecked ( slice) } ) ;
71+ data = unsafe { std:: str:: from_utf8_unchecked ( slice) } ;
7072 } else if is_type ! ( obj_type_ptr, BYTEARRAY_PTR ) {
7173 let buffer = ffi ! ( PyByteArray_AsString ( ptr) ) as * const u8 ;
7274 let length = ffi ! ( PyByteArray_Size ( ptr) ) as usize ;
7375 let slice = unsafe { std:: slice:: from_raw_parts ( buffer, length) } ;
7476 if encoding_rs:: Encoding :: utf8_valid_up_to ( slice) != length {
7577 return Err ( JSONDecodeError :: py_err ( ( INVALID_STR , "" , 0 ) ) ) ;
7678 }
77- data = Cow :: Borrowed ( unsafe { std:: str:: from_utf8_unchecked ( slice) } ) ;
79+ data = unsafe { std:: str:: from_utf8_unchecked ( slice) } ;
7880 } else {
7981 return Err ( JSONDecodeError :: py_err ( (
8082 "Input must be str or bytes" ,
@@ -84,7 +86,7 @@ pub fn deserialize(ptr: *mut pyo3::ffi::PyObject) -> PyResult<NonNull<pyo3::ffi:
8486 }
8587
8688 let seed = JsonValue { } ;
87- let mut deserializer = serde_json:: Deserializer :: from_str ( & data) ;
89+ let mut deserializer = serde_json:: Deserializer :: from_str ( data) ;
8890 match seed. deserialize ( & mut deserializer) {
8991 Ok ( obj) => {
9092 deserializer
0 commit comments