@@ -400,6 +400,70 @@ STATIC mp_obj_t array_extend(mp_obj_t self_in, mp_obj_t arg_in) {
400
400
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (array_extend_obj , array_extend );
401
401
#endif
402
402
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
+
403
467
STATIC mp_obj_t array_subscr (mp_obj_t self_in , mp_obj_t index_in , mp_obj_t value ) {
404
468
if (value == MP_OBJ_NULL ) {
405
469
// delete item
@@ -580,6 +644,12 @@ STATIC MP_DEFINE_CONST_DICT(array_locals_dict, array_locals_dict_table);
580
644
STATIC const mp_rom_map_elem_t bytearray_locals_dict_table [] = {
581
645
{ MP_ROM_QSTR (MP_QSTR_append ), MP_ROM_PTR (& array_append_obj ) },
582
646
{ 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
+
583
653
#if MICROPY_CPYTHON_COMPAT
584
654
{ MP_ROM_QSTR (MP_QSTR_decode ), MP_ROM_PTR (& array_decode_obj ) },
585
655
#endif
0 commit comments