11// SPDX-License-Identifier: (Apache-2.0 OR MIT)
22
33use crate :: exc:: * ;
4+ use crate :: ffi:: PyDict_GET_SIZE ;
45use crate :: opt:: * ;
56use crate :: serialize:: datetime:: * ;
67use crate :: serialize:: serializer:: pyobject_to_obtype;
@@ -19,7 +20,6 @@ pub struct Dict {
1920 default_calls : u8 ,
2021 recursion : u8 ,
2122 default : Option < NonNull < pyo3:: ffi:: PyObject > > ,
22- len : usize ,
2323}
2424
2525impl Dict {
@@ -29,15 +29,13 @@ impl Dict {
2929 default_calls : u8 ,
3030 recursion : u8 ,
3131 default : Option < NonNull < pyo3:: ffi:: PyObject > > ,
32- len : usize ,
3332 ) -> Self {
3433 Dict {
3534 ptr : ptr,
3635 opts : opts,
3736 default_calls : default_calls,
3837 recursion : recursion,
3938 default : default,
40- len : len,
4139 }
4240 }
4341}
@@ -53,7 +51,7 @@ impl<'p> Serialize for Dict {
5351 let mut str_size: pyo3:: ffi:: Py_ssize_t = 0 ;
5452 let mut key: * mut pyo3:: ffi:: PyObject = std:: ptr:: null_mut ( ) ;
5553 let mut value: * mut pyo3:: ffi:: PyObject = std:: ptr:: null_mut ( ) ;
56- for _ in 0 ..=self . len - 1 {
54+ for _ in 0 ..=unsafe { PyDict_GET_SIZE ( self . ptr ) as usize } - 1 {
5755 unsafe {
5856 pyo3:: ffi:: _PyDict_Next (
5957 self . ptr ,
@@ -63,6 +61,13 @@ impl<'p> Serialize for Dict {
6361 std:: ptr:: null_mut ( ) ,
6462 )
6563 } ;
64+ let value = PyObjectSerializer :: new (
65+ value,
66+ self . opts ,
67+ self . default_calls ,
68+ self . recursion + 1 ,
69+ self . default ,
70+ ) ;
6671 if unlikely ! ( unsafe { ob_type!( key) != STR_TYPE } ) {
6772 err ! ( KEY_MUST_BE_STR )
6873 }
@@ -74,13 +79,7 @@ impl<'p> Serialize for Dict {
7479 map. serialize_key ( str_from_slice ! ( data, str_size) ) . unwrap ( ) ;
7580 }
7681
77- map. serialize_value ( & PyObjectSerializer :: new (
78- value,
79- self . opts ,
80- self . default_calls ,
81- self . recursion + 1 ,
82- self . default ,
83- ) ) ?;
82+ map. serialize_value ( & value) ?;
8483 }
8584 map. end ( )
8685 }
@@ -92,7 +91,6 @@ pub struct DictSortedKey {
9291 default_calls : u8 ,
9392 recursion : u8 ,
9493 default : Option < NonNull < pyo3:: ffi:: PyObject > > ,
95- len : usize ,
9694}
9795
9896impl DictSortedKey {
@@ -102,15 +100,13 @@ impl DictSortedKey {
102100 default_calls : u8 ,
103101 recursion : u8 ,
104102 default : Option < NonNull < pyo3:: ffi:: PyObject > > ,
105- len : usize ,
106103 ) -> Self {
107104 DictSortedKey {
108105 ptr : ptr,
109106 opts : opts,
110107 default_calls : default_calls,
111108 recursion : recursion,
112109 default : default,
113- len : len,
114110 }
115111 }
116112}
@@ -121,13 +117,14 @@ impl<'p> Serialize for DictSortedKey {
121117 where
122118 S : Serializer ,
123119 {
120+ let len = unsafe { PyDict_GET_SIZE ( self . ptr ) as usize } ;
124121 let mut items: SmallVec < [ ( & str , * mut pyo3:: ffi:: PyObject ) ; 8 ] > =
125- SmallVec :: with_capacity ( self . len ) ;
122+ SmallVec :: with_capacity ( len) ;
126123 let mut pos = 0isize ;
127124 let mut str_size: pyo3:: ffi:: Py_ssize_t = 0 ;
128125 let mut key: * mut pyo3:: ffi:: PyObject = std:: ptr:: null_mut ( ) ;
129126 let mut value: * mut pyo3:: ffi:: PyObject = std:: ptr:: null_mut ( ) ;
130- for _ in 0 ..=self . len - 1 {
127+ for _ in 0 ..=len - 1 {
131128 unsafe {
132129 pyo3:: ffi:: _PyDict_Next (
133130 self . ptr ,
@@ -180,7 +177,6 @@ pub struct DictNonStrKey {
180177 default_calls : u8 ,
181178 recursion : u8 ,
182179 default : Option < NonNull < pyo3:: ffi:: PyObject > > ,
183- len : usize ,
184180}
185181
186182impl DictNonStrKey {
@@ -190,15 +186,13 @@ impl DictNonStrKey {
190186 default_calls : u8 ,
191187 recursion : u8 ,
192188 default : Option < NonNull < pyo3:: ffi:: PyObject > > ,
193- len : usize ,
194189 ) -> Self {
195190 DictNonStrKey {
196191 ptr : ptr,
197192 opts : opts,
198193 default_calls : default_calls,
199194 recursion : recursion,
200195 default : default,
201- len : len,
202196 }
203197 }
204198
@@ -310,14 +304,15 @@ impl<'p> Serialize for DictNonStrKey {
310304 where
311305 S : Serializer ,
312306 {
307+ let len = unsafe { PyDict_GET_SIZE ( self . ptr ) as usize } ;
313308 let mut items: SmallVec < [ ( InlinableString , * mut pyo3:: ffi:: PyObject ) ; 8 ] > =
314- SmallVec :: with_capacity ( self . len ) ;
309+ SmallVec :: with_capacity ( len) ;
315310 let mut pos = 0isize ;
316311 let mut str_size: pyo3:: ffi:: Py_ssize_t = 0 ;
317312 let mut key: * mut pyo3:: ffi:: PyObject = std:: ptr:: null_mut ( ) ;
318313 let mut value: * mut pyo3:: ffi:: PyObject = std:: ptr:: null_mut ( ) ;
319314 let opts = self . opts & NOT_PASSTHROUGH ;
320- for _ in 0 ..=self . len - 1 {
315+ for _ in 0 ..=len - 1 {
321316 unsafe {
322317 pyo3:: ffi:: _PyDict_Next (
323318 self . ptr ,
0 commit comments