Skip to content

Commit 3114d4b

Browse files
committed
Test get_item_unchecked
1 parent 151672d commit 3114d4b

1 file changed

Lines changed: 36 additions & 30 deletions

File tree

src/lib.rs

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -103,38 +103,40 @@ fn map_key_cmp(a: &[u8], b: &[u8]) -> std::cmp::Ordering {
103103

104104
fn sort_map_keys(keys: &Bound<PyList>, len: usize) -> Result<Vec<(PyBackedStr, usize)>> {
105105
// Returns key and index.
106-
let mut keys_str = Vec::with_capacity(len);
107-
for i in 0..len {
108-
let item = keys.get_item(i)?;
109-
let key = match item.cast::<PyString>() {
110-
Ok(k) => k.to_owned(),
111-
Err(_) => return Err(anyhow!("Map keys must be strings")),
112-
};
113-
let backed_str = match PyBackedStr::try_from(key) {
114-
Ok(bs) => bs,
115-
Err(_) => return Err(anyhow!("Failed to convert PyString to PyBackedStr")),
116-
};
117-
keys_str.push((backed_str, i));
118-
}
106+
unsafe {
107+
let mut keys_str = Vec::with_capacity(len);
108+
for i in 0..len {
109+
let item = keys.get_item_unchecked(i);
110+
let key = match item.cast::<PyString>() {
111+
Ok(k) => k.to_owned(),
112+
Err(_) => return Err(anyhow!("Map keys must be strings")),
113+
};
114+
let backed_str = match PyBackedStr::try_from(key) {
115+
Ok(bs) => bs,
116+
Err(_) => return Err(anyhow!("Failed to convert PyString to PyBackedStr")),
117+
};
118+
keys_str.push((backed_str, i));
119+
}
119120

120-
if keys_str.len() < 2 {
121-
return Ok(keys_str);
122-
}
121+
if keys_str.len() < 2 {
122+
return Ok(keys_str);
123+
}
123124

124-
keys_str.sort_by(|a, b| {
125-
// sort_unstable_by performs bad
126-
let (s1, _) = a;
127-
let (s2, _) = b;
125+
keys_str.sort_by(|a, b| {
126+
// sort_unstable_by performs bad
127+
let (s1, _) = a;
128+
let (s2, _) = b;
128129

129-
// sorted length-first by the byte representation of the string keys
130-
if s1.len() != s2.len() {
131-
s1.len().cmp(&s2.len())
132-
} else {
133-
s1.cmp(s2)
134-
}
135-
});
130+
// sorted length-first by the byte representation of the string keys
131+
if s1.len() != s2.len() {
132+
s1.len().cmp(&s2.len())
133+
} else {
134+
s1.cmp(s2)
135+
}
136+
});
136137

137-
Ok(keys_str)
138+
Ok(keys_str)
139+
}
138140
}
139141

140142
fn get_bytes_from_py_any<'py>(obj: &'py Bound<'py, PyAny>) -> PyResult<&'py [u8]> {
@@ -354,7 +356,9 @@ where
354356
types::Array::bounded(len, w)?;
355357

356358
for i in 0..len {
357-
encode_dag_cbor_from_pyobject(_py, &l.get_item(i)?, w)?;
359+
unsafe {
360+
encode_dag_cbor_from_pyobject(_py, &l.get_item_unchecked(i), w)?;
361+
}
358362
}
359363

360364
Ok(())
@@ -369,7 +373,9 @@ where
369373
key.get(..)
370374
.expect("whole range is a valid string")
371375
.encode(w)?;
372-
encode_dag_cbor_from_pyobject(_py, &values.get_item(i)?, w)?;
376+
unsafe {
377+
encode_dag_cbor_from_pyobject(_py, &values.get_item_unchecked(i), w)?;
378+
}
373379
}
374380

375381
Ok(())

0 commit comments

Comments
 (0)