Skip to content

Commit 0c1091c

Browse files
committed
dict key, val stalled cycles opt
1 parent 58a73f3 commit 0c1091c

File tree

1 file changed

+49
-42
lines changed

1 file changed

+49
-42
lines changed

src/serialize/per_type/dict.rs

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ impl Dict {
9797
}
9898
}
9999
impl Serialize for Dict {
100+
#[inline(never)]
100101
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
101102
where
102103
S: Serializer,
@@ -118,54 +119,59 @@ impl Serialize for Dict {
118119
pydict_next!(self.ptr, &mut pos, &mut next_key, &mut next_value);
119120

120121
// key
121-
{
122-
let key_ob_type = ob_type!(key);
123-
if unlikely!(!is_class_by_type!(key_ob_type, STR_TYPE)) {
124-
err!(SerializeError::KeyMustBeStr)
125-
}
126-
let key_as_str = unicode_to_str(key);
127-
if unlikely!(key_as_str.is_none()) {
128-
err!(SerializeError::InvalidStr)
129-
}
130-
map.serialize_key(key_as_str.unwrap()).unwrap();
122+
let key_ob_type = ob_type!(key);
123+
if unlikely!(!is_class_by_type!(key_ob_type, STR_TYPE)) {
124+
err!(SerializeError::KeyMustBeStr)
125+
}
126+
let key_as_str = unicode_to_str(key);
127+
if unlikely!(key_as_str.is_none()) {
128+
err!(SerializeError::InvalidStr)
131129
}
132130

133131
// value
134-
{
135-
let value_ob_type = ob_type!(value);
136-
if is_class_by_type!(value_ob_type, STR_TYPE) {
137-
map.serialize_value(&StrSerializer::new(value))?;
138-
} else if is_class_by_type!(value_ob_type, INT_TYPE) {
139-
if unlikely!(opt_enabled!(self.state.opts(), STRICT_INTEGER)) {
140-
map.serialize_value(&Int53Serializer::new(value))?;
141-
} else {
142-
map.serialize_value(&IntSerializer::new(value))?;
143-
}
144-
} else if is_class_by_type!(value_ob_type, BOOL_TYPE) {
145-
map.serialize_value(&BoolSerializer::new(value))?;
146-
} else if is_class_by_type!(value_ob_type, NONE_TYPE) {
147-
map.serialize_value(&NoneSerializer::new())?;
148-
} else if is_class_by_type!(value_ob_type, FLOAT_TYPE) {
149-
map.serialize_value(&FloatSerializer::new(value))?;
150-
} else if is_class_by_type!(value_ob_type, DICT_TYPE) {
151-
let pyvalue = DictGenericSerializer::new(value, self.state, self.default);
152-
map.serialize_value(&pyvalue)?;
153-
} else if is_class_by_type!(value_ob_type, LIST_TYPE) {
154-
if ffi!(Py_SIZE(value)) == 0 {
155-
map.serialize_value(&ZeroListSerializer::new())?;
156-
} else {
157-
let pyvalue =
158-
ListTupleSerializer::from_list(value, self.state, self.default);
159-
map.serialize_value(&pyvalue)?;
160-
}
161-
} else if is_class_by_type!(value_ob_type, DATETIME_TYPE)
162-
&& opt_disabled!(self.state.opts(), PASSTHROUGH_DATETIME)
163-
{
164-
map.serialize_value(&DateTime::new(value, self.state.opts()))?;
132+
let value_ob_type = ob_type!(value);
133+
if is_class_by_type!(value_ob_type, STR_TYPE) {
134+
map.serialize_key(key_as_str.unwrap()).unwrap();
135+
map.serialize_value(&StrSerializer::new(value))?;
136+
} else if is_class_by_type!(value_ob_type, INT_TYPE) {
137+
if unlikely!(opt_enabled!(self.state.opts(), STRICT_INTEGER)) {
138+
map.serialize_key(key_as_str.unwrap()).unwrap();
139+
map.serialize_value(&Int53Serializer::new(value))?;
140+
} else {
141+
map.serialize_key(key_as_str.unwrap()).unwrap();
142+
map.serialize_value(&IntSerializer::new(value))?;
143+
}
144+
} else if is_class_by_type!(value_ob_type, BOOL_TYPE) {
145+
map.serialize_key(key_as_str.unwrap()).unwrap();
146+
map.serialize_value(&BoolSerializer::new(value))?;
147+
} else if is_class_by_type!(value_ob_type, NONE_TYPE) {
148+
map.serialize_key(key_as_str.unwrap()).unwrap();
149+
map.serialize_value(&NoneSerializer::new())?;
150+
} else if is_class_by_type!(value_ob_type, FLOAT_TYPE) {
151+
map.serialize_key(key_as_str.unwrap()).unwrap();
152+
map.serialize_value(&FloatSerializer::new(value))?;
153+
} else if is_class_by_type!(value_ob_type, DICT_TYPE) {
154+
let pyvalue = DictGenericSerializer::new(value, self.state, self.default);
155+
map.serialize_key(key_as_str.unwrap()).unwrap();
156+
map.serialize_value(&pyvalue)?;
157+
} else if is_class_by_type!(value_ob_type, LIST_TYPE) {
158+
if ffi!(Py_SIZE(value)) == 0 {
159+
map.serialize_key(key_as_str.unwrap()).unwrap();
160+
map.serialize_value(&ZeroListSerializer::new())?;
165161
} else {
166-
let pyvalue = PyObjectSerializer::new(value, self.state, self.default);
162+
let pyvalue = ListTupleSerializer::from_list(value, self.state, self.default);
163+
map.serialize_key(key_as_str.unwrap()).unwrap();
167164
map.serialize_value(&pyvalue)?;
168165
}
166+
} else if is_class_by_type!(value_ob_type, DATETIME_TYPE)
167+
&& opt_disabled!(self.state.opts(), PASSTHROUGH_DATETIME)
168+
{
169+
map.serialize_key(key_as_str.unwrap()).unwrap();
170+
map.serialize_value(&DateTime::new(value, self.state.opts()))?;
171+
} else {
172+
let pyvalue = PyObjectSerializer::new(value, self.state, self.default);
173+
map.serialize_key(key_as_str.unwrap()).unwrap();
174+
map.serialize_value(&pyvalue)?;
169175
}
170176
}
171177

@@ -257,6 +263,7 @@ impl DictNonStrKey {
257263
}
258264
}
259265

266+
#[inline(never)]
260267
fn pyobject_to_string(
261268
key: *mut pyo3_ffi::PyObject,
262269
opts: crate::opt::Opt,

0 commit comments

Comments
 (0)