1
1
// SPDX-License-Identifier: (Apache-2.0 OR MIT)
2
2
3
- use crate :: opt:: * ;
4
3
use crate :: serialize:: error:: SerializeError ;
5
- use crate :: serialize:: serializer:: { PyObjectSerializer , RECURSION_LIMIT } ;
4
+ use crate :: serialize:: serializer:: PyObjectSerializer ;
5
+ use crate :: serialize:: state:: SerializerState ;
6
6
use crate :: str:: unicode_to_str;
7
- use crate :: typeref:: * ;
7
+ use crate :: typeref:: {
8
+ DATACLASS_FIELDS_STR , DICT_STR , FIELD_TYPE , FIELD_TYPE_STR , SLOTS_STR , STR_TYPE ,
9
+ } ;
8
10
9
11
use serde:: ser:: { Serialize , SerializeMap , Serializer } ;
10
12
11
13
use std:: ptr:: NonNull ;
12
14
13
- pub struct DataclassGenericSerializer {
14
- ptr : * mut pyo3_ffi:: PyObject ,
15
- opts : Opt ,
16
- default_calls : u8 ,
17
- recursion : u8 ,
18
- default : Option < NonNull < pyo3_ffi:: PyObject > > ,
15
+ #[ repr( transparent) ]
16
+ pub struct DataclassGenericSerializer < ' a > {
17
+ previous : & ' a PyObjectSerializer ,
19
18
}
20
19
21
- impl DataclassGenericSerializer {
22
- pub fn new (
23
- ptr : * mut pyo3_ffi:: PyObject ,
24
- opts : Opt ,
25
- default_calls : u8 ,
26
- recursion : u8 ,
27
- default : Option < NonNull < pyo3_ffi:: PyObject > > ,
28
- ) -> Self {
29
- DataclassGenericSerializer {
30
- ptr : ptr,
31
- opts : opts,
32
- default_calls : default_calls,
33
- recursion : recursion + 1 ,
34
- default : default,
35
- }
20
+ impl < ' a > DataclassGenericSerializer < ' a > {
21
+ pub fn new ( previous : & ' a PyObjectSerializer ) -> Self {
22
+ Self { previous : previous }
36
23
}
37
24
}
38
25
39
- impl Serialize for DataclassGenericSerializer {
26
+ impl < ' a > Serialize for DataclassGenericSerializer < ' a > {
40
27
#[ inline( never) ]
41
28
fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
42
29
where
43
30
S : Serializer ,
44
31
{
45
- if unlikely ! ( self . recursion == RECURSION_LIMIT ) {
32
+ if unlikely ! ( self . previous . state . recursion_limit ( ) ) {
46
33
err ! ( SerializeError :: RecursionLimit )
47
34
}
48
- let dict = ffi ! ( PyObject_GetAttr ( self . ptr, DICT_STR ) ) ;
49
- let ob_type = ob_type ! ( self . ptr) ;
35
+ let dict = ffi ! ( PyObject_GetAttr ( self . previous . ptr, DICT_STR ) ) ;
36
+ let ob_type = ob_type ! ( self . previous . ptr) ;
50
37
if unlikely ! ( dict. is_null( ) ) {
51
38
ffi ! ( PyErr_Clear ( ) ) ;
52
39
DataclassFallbackSerializer :: new (
53
- self . ptr ,
54
- self . opts ,
55
- self . default_calls ,
56
- self . recursion ,
57
- self . default ,
40
+ self . previous . ptr ,
41
+ self . previous . state ,
42
+ self . previous . default ,
58
43
)
59
44
. serialize ( serializer)
60
45
} else if pydict_contains ! ( ob_type, SLOTS_STR ) {
61
46
let ret = DataclassFallbackSerializer :: new (
62
- self . ptr ,
63
- self . opts ,
64
- self . default_calls ,
65
- self . recursion ,
66
- self . default ,
47
+ self . previous . ptr ,
48
+ self . previous . state ,
49
+ self . previous . default ,
67
50
)
68
51
. serialize ( serializer) ;
69
52
ffi ! ( Py_DECREF ( dict) ) ;
70
53
ret
71
54
} else {
72
- let ret = DataclassFastSerializer :: new (
73
- dict,
74
- self . opts ,
75
- self . default_calls ,
76
- self . recursion ,
77
- self . default ,
78
- )
79
- . serialize ( serializer) ;
55
+ let ret =
56
+ DataclassFastSerializer :: new ( dict, self . previous . state , self . previous . default )
57
+ . serialize ( serializer) ;
80
58
ffi ! ( Py_DECREF ( dict) ) ;
81
59
ret
82
60
}
@@ -85,25 +63,19 @@ impl Serialize for DataclassGenericSerializer {
85
63
86
64
pub struct DataclassFastSerializer {
87
65
ptr : * mut pyo3_ffi:: PyObject ,
88
- opts : Opt ,
89
- default_calls : u8 ,
90
- recursion : u8 ,
66
+ state : SerializerState ,
91
67
default : Option < NonNull < pyo3_ffi:: PyObject > > ,
92
68
}
93
69
94
70
impl DataclassFastSerializer {
95
71
pub fn new (
96
72
ptr : * mut pyo3_ffi:: PyObject ,
97
- opts : Opt ,
98
- default_calls : u8 ,
99
- recursion : u8 ,
73
+ state : SerializerState ,
100
74
default : Option < NonNull < pyo3_ffi:: PyObject > > ,
101
75
) -> Self {
102
76
DataclassFastSerializer {
103
77
ptr : ptr,
104
- opts : opts,
105
- default_calls : default_calls,
106
- recursion : recursion,
78
+ state : state. copy_for_recursive_call ( ) ,
107
79
default : default,
108
80
}
109
81
}
@@ -142,13 +114,7 @@ impl Serialize for DataclassFastSerializer {
142
114
if unlikely ! ( key_as_str. as_bytes( ) [ 0 ] == b'_' ) {
143
115
continue ;
144
116
}
145
- let pyvalue = PyObjectSerializer :: new (
146
- value,
147
- self . opts ,
148
- self . default_calls ,
149
- self . recursion ,
150
- self . default ,
151
- ) ;
117
+ let pyvalue = PyObjectSerializer :: new ( value, self . state , self . default ) ;
152
118
map. serialize_key ( key_as_str) . unwrap ( ) ;
153
119
map. serialize_value ( & pyvalue) ?;
154
120
}
@@ -158,25 +124,19 @@ impl Serialize for DataclassFastSerializer {
158
124
159
125
pub struct DataclassFallbackSerializer {
160
126
ptr : * mut pyo3_ffi:: PyObject ,
161
- opts : Opt ,
162
- default_calls : u8 ,
163
- recursion : u8 ,
127
+ state : SerializerState ,
164
128
default : Option < NonNull < pyo3_ffi:: PyObject > > ,
165
129
}
166
130
167
131
impl DataclassFallbackSerializer {
168
132
pub fn new (
169
133
ptr : * mut pyo3_ffi:: PyObject ,
170
- opts : Opt ,
171
- default_calls : u8 ,
172
- recursion : u8 ,
134
+ state : SerializerState ,
173
135
default : Option < NonNull < pyo3_ffi:: PyObject > > ,
174
136
) -> Self {
175
137
DataclassFallbackSerializer {
176
138
ptr : ptr,
177
- opts : opts,
178
- default_calls : default_calls,
179
- recursion : recursion,
139
+ state : state. copy_for_recursive_call ( ) ,
180
140
default : default,
181
141
}
182
142
}
@@ -226,13 +186,7 @@ impl Serialize for DataclassFallbackSerializer {
226
186
let value = ffi ! ( PyObject_GetAttr ( self . ptr, attr) ) ;
227
187
debug_assert ! ( ffi!( Py_REFCNT ( value) ) >= 2 ) ;
228
188
ffi ! ( Py_DECREF ( value) ) ;
229
- let pyvalue = PyObjectSerializer :: new (
230
- value,
231
- self . opts ,
232
- self . default_calls ,
233
- self . recursion ,
234
- self . default ,
235
- ) ;
189
+ let pyvalue = PyObjectSerializer :: new ( value, self . state , self . default ) ;
236
190
237
191
map. serialize_key ( key_as_str) . unwrap ( ) ;
238
192
map. serialize_value ( & pyvalue) ?
0 commit comments