in src/serialize/per_type/int.rs [80:111]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
unsafe {
if crate::ffi::pylong_is_unsigned(self.ptr) {
let val = ffi!(PyLong_AsUnsignedLongLong(self.ptr));
if unlikely!(val == u64::MAX) && !ffi!(PyErr_Occurred()).is_null() {
ffi!(PyErr_Clear());
err!(SerializeError::Integer64Bits)
} else if unlikely!(opt_enabled!(self.opts, STRICT_INTEGER))
&& val > STRICT_INT_MAX as u64
{
err!(SerializeError::Integer53Bits)
} else {
serializer.serialize_u64(val)
}
} else {
let val = ffi!(PyLong_AsLongLong(self.ptr));
if unlikely!(val == -1) && !ffi!(PyErr_Occurred()).is_null() {
ffi!(PyErr_Clear());
err!(SerializeError::Integer64Bits)
} else if unlikely!(opt_enabled!(self.opts, STRICT_INTEGER))
&& !(STRICT_INT_MIN..=STRICT_INT_MAX).contains(&val)
{
err!(SerializeError::Integer53Bits)
} else {
serializer.serialize_i64(val)
}
}
}
}