@@ -17,7 +17,7 @@ use unicode_xid::UnicodeXID;
17
17
use super :: objbytes:: PyBytes ;
18
18
use super :: objdict:: PyDict ;
19
19
use super :: objfloat;
20
- use super :: objint:: { self , PyInt } ;
20
+ use super :: objint:: { self , PyInt , PyIntRef } ;
21
21
use super :: objiter;
22
22
use super :: objnone:: PyNone ;
23
23
use super :: objsequence:: PySliceableSequence ;
@@ -229,21 +229,26 @@ impl PyString {
229
229
}
230
230
231
231
#[ pymethod( name = "__getitem__" ) ]
232
- fn getitem ( & self , needle : Either < isize , PySliceRef > , vm : & VirtualMachine ) -> PyResult {
232
+ fn getitem ( & self , needle : Either < PyIntRef , PySliceRef > , vm : & VirtualMachine ) -> PyResult {
233
233
match needle {
234
- Either :: A ( pos) => {
235
- let index: usize = if pos. is_negative ( ) {
236
- ( self . value . chars ( ) . count ( ) as isize + pos) as usize
237
- } else {
238
- pos. abs ( ) as usize
239
- } ;
234
+ Either :: A ( pos) => match pos. as_bigint ( ) . to_isize ( ) {
235
+ Some ( pos) => {
236
+ let index: usize = if pos. is_negative ( ) {
237
+ ( self . value . chars ( ) . count ( ) as isize + pos) as usize
238
+ } else {
239
+ pos. abs ( ) as usize
240
+ } ;
240
241
241
- if let Some ( character) = self . value . chars ( ) . nth ( index) {
242
- Ok ( vm. new_str ( character. to_string ( ) ) )
243
- } else {
244
- Err ( vm. new_index_error ( "string index out of range" . to_string ( ) ) )
242
+ if let Some ( character) = self . value . chars ( ) . nth ( index) {
243
+ Ok ( vm. new_str ( character. to_string ( ) ) )
244
+ } else {
245
+ Err ( vm. new_index_error ( "string index out of range" . to_string ( ) ) )
246
+ }
245
247
}
246
- }
248
+ None => Err (
249
+ vm. new_index_error ( "cannot fit 'int' into an index-sized integer" . to_string ( ) )
250
+ ) ,
251
+ } ,
247
252
Either :: B ( slice) => {
248
253
let string = self
249
254
. value
0 commit comments