in src/serialize/per_type/dict.rs [272:313]
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 len = ffi!(Py_SIZE(self.ptr)) as usize;
assume!(len > 0);
let mut items: SmallVec<[(&str, *mut pyo3_ffi::PyObject); 8]> =
SmallVec::with_capacity(len);
for _ in 0..len as usize {
let key = next_key;
let value = next_value;
pydict_next!(self.ptr, &mut pos, &mut next_key, &mut next_value);
if unlikely!(unsafe { ob_type!(key) != STR_TYPE }) {
err!(SerializeError::KeyMustBeStr)
}
let data = unicode_to_str(key);
if unlikely!(data.is_none()) {
err!(SerializeError::InvalidStr)
}
items.push((data.unwrap(), value));
}
items.sort_unstable_by(|a, b| a.0.cmp(b.0));
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()
}