Skip to content

Commit 6bcfd63

Browse files
committed
Serialization uses try_from_unchecked
1 parent 5a1d806 commit 6bcfd63

1 file changed

Lines changed: 12 additions & 9 deletions

File tree

src/encode.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
7171
{
7272
let obj_ptr = self.obj.get_type_ptr();
7373
if obj_ptr == self.refs.str {
74-
let val: &PyUnicode = self.obj.extract().unwrap();
74+
let val = unsafe { <PyUnicode as PyTryFrom>::try_from_unchecked(self.obj) };
7575
serializer.serialize_str(unsafe { std::str::from_utf8_unchecked(val.as_bytes()) })
7676
} else if obj_ptr == self.refs.bytes {
77-
let val: &PyBytes = self.obj.extract().unwrap();
77+
let val = unsafe { <PyBytes as PyTryFrom>::try_from_unchecked(self.obj) };
7878
serializer.serialize_str(unsafe { std::str::from_utf8_unchecked(val.as_bytes()) })
7979
} else if obj_ptr == self.refs.dict {
80-
let val: &PyDict = self.obj.extract().unwrap();
80+
let val = unsafe { <PyDict as PyTryFrom>::try_from_unchecked(self.obj) };
8181
let len = val.len();
8282
if len != 0 {
8383
let mut map = serializer.serialize_map(Some(len))?;
@@ -88,9 +88,12 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
8888
key
8989
)));
9090
}
91-
let keystr: &PyUnicode = key.extract().unwrap();
9291
map.serialize_entry(
93-
unsafe { std::str::from_utf8_unchecked(keystr.as_bytes()) },
92+
unsafe {
93+
std::str::from_utf8_unchecked(
94+
<PyUnicode as PyTryFrom>::try_from_unchecked(key).as_bytes(),
95+
)
96+
},
9497
&SerializePyObject {
9598
py: self.py,
9699
refs: self.refs,
@@ -103,7 +106,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
103106
serializer.serialize_map(None).unwrap().end()
104107
}
105108
} else if obj_ptr == self.refs.list {
106-
let val: &PyList = self.obj.extract().unwrap();
109+
let val = unsafe { <PyList as PyTryFrom>::try_from_unchecked(self.obj) };
107110
let len = val.len();
108111
if len != 0 {
109112
let mut seq = serializer.serialize_seq(Some(len))?;
@@ -119,7 +122,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
119122
serializer.serialize_seq(None).unwrap().end()
120123
}
121124
} else if obj_ptr == self.refs.tuple {
122-
let val: &PyTuple = self.obj.extract().unwrap();
125+
let val = unsafe { <PyTuple as PyTryFrom>::try_from_unchecked(self.obj) };
123126
let len = val.len();
124127
if len != 0 {
125128
let mut seq = serializer.serialize_seq(Some(len))?;
@@ -135,7 +138,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
135138
serializer.serialize_seq(None).unwrap().end()
136139
}
137140
} else if obj_ptr == self.refs.bool {
138-
let val: &PyBool = self.obj.extract().unwrap();
141+
let val = unsafe { <PyBool as PyTryFrom>::try_from_unchecked(self.obj) };
139142
serializer.serialize_bool(val.is_true())
140143
} else if obj_ptr == self.refs.int {
141144
if let Ok(val) = <i64 as FromPyObject>::extract(self.obj) {
@@ -147,7 +150,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
147150
)))
148151
}
149152
} else if obj_ptr == self.refs.float {
150-
let val: &PyFloat = self.obj.extract().unwrap();
153+
let val = unsafe { <PyFloat as PyTryFrom>::try_from_unchecked(self.obj) };
151154
serializer.serialize_f64(val.value())
152155
} else if obj_ptr == self.refs.none {
153156
serializer.serialize_unit()

0 commit comments

Comments
 (0)