@@ -441,7 +441,7 @@ STATIC mp_obj_t str_split(uint n_args, const mp_obj_t *args) {
441441 return res ;
442442}
443443
444- STATIC mp_obj_t str_finder (uint n_args , const mp_obj_t * args , machine_int_t direction ) {
444+ STATIC mp_obj_t str_finder (uint n_args , const mp_obj_t * args , machine_int_t direction , bool is_index ) {
445445 assert (2 <= n_args && n_args <= 4 );
446446 assert (MP_OBJ_IS_STR (args [0 ]));
447447 assert (MP_OBJ_IS_STR (args [1 ]));
@@ -461,19 +461,31 @@ STATIC mp_obj_t str_finder(uint n_args, const mp_obj_t *args, machine_int_t dire
461461 const byte * p = find_subbytes (haystack + start , end - start , needle , needle_len , direction );
462462 if (p == NULL ) {
463463 // not found
464- return MP_OBJ_NEW_SMALL_INT (-1 );
464+ if (is_index ) {
465+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "substring not found" ));
466+ } else {
467+ return MP_OBJ_NEW_SMALL_INT (-1 );
468+ }
465469 } else {
466470 // found
467471 return MP_OBJ_NEW_SMALL_INT (p - haystack );
468472 }
469473}
470474
471475STATIC mp_obj_t str_find (uint n_args , const mp_obj_t * args ) {
472- return str_finder (n_args , args , 1 );
476+ return str_finder (n_args , args , 1 , false );
473477}
474478
475479STATIC mp_obj_t str_rfind (uint n_args , const mp_obj_t * args ) {
476- return str_finder (n_args , args , -1 );
480+ return str_finder (n_args , args , -1 , false);
481+ }
482+
483+ STATIC mp_obj_t str_index (uint n_args , const mp_obj_t * args ) {
484+ return str_finder (n_args , args , 1 , true);
485+ }
486+
487+ STATIC mp_obj_t str_rindex (uint n_args , const mp_obj_t * args ) {
488+ return str_finder (n_args , args , -1 , true);
477489}
478490
479491// TODO: (Much) more variety in args
@@ -1307,6 +1319,8 @@ STATIC machine_int_t str_get_buffer(mp_obj_t self_in, buffer_info_t *bufinfo, in
13071319
13081320STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (str_find_obj , 2 , 4 , str_find );
13091321STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (str_rfind_obj , 2 , 4 , str_rfind );
1322+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (str_index_obj , 2 , 4 , str_index );
1323+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (str_rindex_obj , 2 , 4 , str_rindex );
13101324STATIC MP_DEFINE_CONST_FUN_OBJ_2 (str_join_obj , str_join );
13111325STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (str_split_obj , 1 , 3 , str_split );
13121326STATIC MP_DEFINE_CONST_FUN_OBJ_2 (str_startswith_obj , str_startswith );
@@ -1320,6 +1334,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(str_rpartition_obj, str_rpartition);
13201334STATIC const mp_map_elem_t str_locals_dict_table [] = {
13211335 { MP_OBJ_NEW_QSTR (MP_QSTR_find ), (mp_obj_t )& str_find_obj },
13221336 { MP_OBJ_NEW_QSTR (MP_QSTR_rfind ), (mp_obj_t )& str_rfind_obj },
1337+ { MP_OBJ_NEW_QSTR (MP_QSTR_index ), (mp_obj_t )& str_index_obj },
1338+ { MP_OBJ_NEW_QSTR (MP_QSTR_rindex ), (mp_obj_t )& str_rindex_obj },
13231339 { MP_OBJ_NEW_QSTR (MP_QSTR_join ), (mp_obj_t )& str_join_obj },
13241340 { MP_OBJ_NEW_QSTR (MP_QSTR_split ), (mp_obj_t )& str_split_obj },
13251341 { MP_OBJ_NEW_QSTR (MP_QSTR_startswith ), (mp_obj_t )& str_startswith_obj },
0 commit comments