@@ -253,6 +253,21 @@ fn tuple_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
253
253
get_item ( vm, tuple, & get_elements ( & tuple) , needle. clone ( ) )
254
254
}
255
255
256
+ pub fn tuple_index ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
257
+ arg_check ! (
258
+ vm,
259
+ args,
260
+ required = [ ( tuple, Some ( vm. ctx. tuple_type( ) ) ) , ( needle, None ) ]
261
+ ) ;
262
+ for ( index, element) in get_elements ( tuple) . iter ( ) . enumerate ( ) {
263
+ let py_equal = vm. call_method ( needle, "__eq__" , vec ! [ element. clone( ) ] ) ?;
264
+ if objbool:: get_value ( & py_equal) {
265
+ return Ok ( vm. context ( ) . new_int ( index) ) ;
266
+ }
267
+ }
268
+ Err ( vm. new_value_error ( "tuple.index(x): x not in tuple" . to_string ( ) ) )
269
+ }
270
+
256
271
pub fn tuple_contains ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
257
272
arg_check ! (
258
273
vm,
@@ -298,4 +313,5 @@ pub fn init(context: &PyContext) {
298
313
context. set_attr ( & tuple_type, "__le__" , context. new_rustfunc ( tuple_le) ) ;
299
314
context. set_attr ( & tuple_type, "__gt__" , context. new_rustfunc ( tuple_gt) ) ;
300
315
context. set_attr ( & tuple_type, "__ge__" , context. new_rustfunc ( tuple_ge) ) ;
316
+ context. set_attr ( & tuple_type, "index" , context. new_rustfunc ( tuple_index) ) ;
301
317
}
0 commit comments