22
33use crate :: typeref;
44use pyo3:: prelude:: * ;
5- use pyo3:: types:: * ;
65use serde:: de:: { self , DeserializeSeed , Deserializer , MapAccess , SeqAccess , Visitor } ;
76use smallvec:: SmallVec ;
87use std:: borrow:: Cow ;
@@ -12,25 +11,25 @@ use std::os::raw::c_char;
1211
1312import_exception ! ( json, JSONDecodeError ) ;
1413
15- pub fn deserialize ( py : Python , obj : PyObject ) -> PyResult < PyObject > {
16- let obj_ref = obj. as_ref ( py) ;
17- let obj_ptr = obj_ref. get_type_ptr ( ) ;
14+ pub fn deserialize ( py : Python , ptr : * mut pyo3:: ffi:: PyObject ) -> PyResult < PyObject > {
15+ let obj_type_ptr = unsafe { ( * ptr) . ob_type } ;
1816 let data: Cow < str > ;
19- if unsafe { obj_ptr == typeref:: STR_PTR } {
17+ if unsafe { obj_type_ptr == typeref:: STR_PTR } {
18+ let mut str_size: pyo3:: ffi:: Py_ssize_t = unsafe { std:: mem:: uninitialized ( ) } ;
2019 data = unsafe {
21- Cow :: Borrowed ( std:: str:: from_utf8_unchecked (
22- <PyUnicode as PyTryFrom >:: try_from_unchecked ( obj_ref) . as_bytes ( ) ,
23- ) )
20+ Cow :: Borrowed ( std:: str:: from_utf8_unchecked ( std:: slice:: from_raw_parts (
21+ pyo3:: ffi:: PyUnicode_AsUTF8AndSize ( ptr, & mut str_size) as * const u8 ,
22+ str_size as usize ,
23+ ) ) )
2424 } ;
25- } else if unsafe { obj_ptr == typeref:: BYTES_PTR } {
26- data = String :: from_utf8_lossy ( unsafe {
27- < PyBytes as PyTryFrom > :: try_from_unchecked ( obj_ref ) . as_bytes ( )
28- } ) ;
25+ } else if unsafe { obj_type_ptr == typeref:: BYTES_PTR } {
26+ let buffer = unsafe { pyo3 :: ffi :: PyBytes_AsString ( ptr ) as * const u8 } ;
27+ let length = unsafe { pyo3 :: ffi :: PyBytes_Size ( ptr ) as usize } ;
28+ data = unsafe { String :: from_utf8_lossy ( std :: slice :: from_raw_parts ( buffer , length ) ) } ;
2929 } else {
30- return Err ( pyo3:: exceptions:: TypeError :: py_err ( format ! (
31- "Input must be str or bytes, not: {}" ,
32- obj_ref. get_type( ) . name( )
33- ) ) ) ;
30+ return Err ( pyo3:: exceptions:: TypeError :: py_err (
31+ "Input must be str or bytes" ,
32+ ) ) ;
3433 }
3534
3635 let seed = JsonValue :: new ( ) ;
0 commit comments