@@ -400,6 +400,70 @@ STATIC mp_obj_t array_extend(mp_obj_t self_in, mp_obj_t arg_in) {
400400STATIC MP_DEFINE_CONST_FUN_OBJ_2 (array_extend_obj , array_extend );
401401#endif
402402
403+ #if MICROPY_PY_BUILTINS_BYTEARRAY
404+ STATIC mp_obj_t buffer_finder (size_t n_args , const mp_obj_t * args , int direction , bool is_index ) {
405+ mp_check_self (MP_OBJ_IS_TYPE (args [0 ], & mp_type_bytearray ));
406+ const mp_obj_type_t * self_type = mp_obj_get_type (args [0 ]);
407+
408+ mp_buffer_info_t haystack_bufinfo ;
409+ mp_get_buffer_raise (args [0 ], & haystack_bufinfo , MP_BUFFER_READ );
410+
411+ mp_buffer_info_t needle_bufinfo ;
412+ mp_get_buffer_raise (args [1 ], & needle_bufinfo , MP_BUFFER_READ );
413+
414+ if (mp_binary_get_size ('@' , needle_bufinfo .typecode , NULL ) != 1 ) {
415+ const qstr src_name = mp_obj_get_type (args [1 ])-> name ;
416+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_TypeError ,
417+ translate ("'%q' object is not bytes-like" ),
418+ src_name ));
419+ }
420+
421+ const byte * start = haystack_bufinfo .buf ;
422+ const byte * end = haystack_bufinfo .buf + haystack_bufinfo .len ;
423+ if (n_args >= 3 && args [2 ] != mp_const_none ) {
424+ start += mp_get_index (self_type , haystack_bufinfo .len , args [2 ], true);
425+ }
426+ if (n_args >= 4 && args [3 ] != mp_const_none ) {
427+ end = haystack_bufinfo .buf + mp_get_index (self_type , haystack_bufinfo .len , args [3 ], true);
428+ }
429+
430+ const byte * p = NULL ;
431+ if (end >= start ) {
432+ p = find_subbytes (start , end - start , needle_bufinfo .buf , needle_bufinfo .len , direction );
433+ }
434+
435+ if (p == NULL ) {
436+ if (is_index ) {
437+ mp_raise_ValueError (translate ("substring not found" ));
438+ } else {
439+ return MP_OBJ_NEW_SMALL_INT (-1 );
440+ }
441+ }
442+ return MP_OBJ_NEW_SMALL_INT (p - (const byte * ) haystack_bufinfo .buf );
443+ }
444+
445+ STATIC mp_obj_t buffer_find (size_t n_args , const mp_obj_t * args ) {
446+ return buffer_finder (n_args , args , 1 , false);
447+ }
448+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_find_obj , 2 , 4 , buffer_find );
449+
450+ STATIC mp_obj_t buffer_rfind (size_t n_args , const mp_obj_t * args ) {
451+ return buffer_finder (n_args , args , -1 , false);
452+ }
453+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_rfind_obj , 2 , 4 , buffer_rfind );
454+
455+ STATIC mp_obj_t buffer_index (size_t n_args , const mp_obj_t * args ) {
456+ return buffer_finder (n_args , args , 1 , true);
457+ }
458+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_index_obj , 2 , 4 , buffer_index );
459+
460+ STATIC mp_obj_t buffer_rindex (size_t n_args , const mp_obj_t * args ) {
461+ return buffer_finder (n_args , args , -1 , true);
462+ }
463+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_rindex_obj , 2 , 4 , buffer_rindex );
464+
465+ #endif
466+
403467STATIC mp_obj_t array_subscr (mp_obj_t self_in , mp_obj_t index_in , mp_obj_t value ) {
404468 if (value == MP_OBJ_NULL ) {
405469 // delete item
@@ -580,6 +644,12 @@ STATIC MP_DEFINE_CONST_DICT(array_locals_dict, array_locals_dict_table);
580644STATIC const mp_rom_map_elem_t bytearray_locals_dict_table [] = {
581645 { MP_ROM_QSTR (MP_QSTR_append ), MP_ROM_PTR (& array_append_obj ) },
582646 { MP_ROM_QSTR (MP_QSTR_extend ), MP_ROM_PTR (& array_extend_obj ) },
647+
648+ { MP_ROM_QSTR (MP_QSTR_find ), MP_ROM_PTR (& buffer_find_obj ) },
649+ { MP_ROM_QSTR (MP_QSTR_rfind ), MP_ROM_PTR (& buffer_rfind_obj ) },
650+ { MP_ROM_QSTR (MP_QSTR_index ), MP_ROM_PTR (& buffer_index_obj ) },
651+ { MP_ROM_QSTR (MP_QSTR_rindex ), MP_ROM_PTR (& buffer_rindex_obj ) },
652+
583653#if MICROPY_CPYTHON_COMPAT
584654 { MP_ROM_QSTR (MP_QSTR_decode ), MP_ROM_PTR (& array_decode_obj ) },
585655#endif
0 commit comments