in src/serialize/per_type/dict.rs [464:513]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut pos = 0;
let mut next_key: *mut pyo3_ffi::PyObject = core::ptr::null_mut();
let mut next_value: *mut pyo3_ffi::PyObject = core::ptr::null_mut();
pydict_next!(self.ptr, &mut pos, &mut next_key, &mut next_value);
let opts = self.state.opts() & NOT_PASSTHROUGH;
let len = ffi!(Py_SIZE(self.ptr)) as usize;
assume!(len > 0);
let mut items: SmallVec<[(CompactString, *mut pyo3_ffi::PyObject); 8]> =
SmallVec::with_capacity(len);
for _ in 0..len {
let key = next_key;
let value = next_value;
pydict_next!(self.ptr, &mut pos, &mut next_key, &mut next_value);
if is_type!(ob_type!(key), STR_TYPE) {
let uni = unicode_to_str(key);
if unlikely!(uni.is_none()) {
err!(SerializeError::InvalidStr)
}
items.push((CompactString::from(uni.unwrap()), value));
} else {
match Self::pyobject_to_string(key, opts) {
Ok(key_as_str) => items.push((key_as_str, value)),
Err(err) => err!(err),
}
}
}
if opt_enabled!(opts, SORT_KEYS) {
sort_non_str_dict_items(&mut items);
}
let mut map = serializer.serialize_map(None).unwrap();
for (key, val) in items.iter() {
let pyvalue = PyObjectSerializer::new(*val, self.state, self.default);
map.serialize_key(key).unwrap();
map.serialize_value(&pyvalue)?;
}
map.end()
}