@@ -103,38 +103,40 @@ fn map_key_cmp(a: &[u8], b: &[u8]) -> std::cmp::Ordering {
103103
104104fn 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
140142fn 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