@@ -400,6 +400,66 @@ 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 && MICROPY_CPYTHON_COMPAT
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
+ mp_raise_TypeError (translate ("a bytes-like object is required" ));
416
+ }
417
+
418
+ const byte * start = haystack_bufinfo .buf ;
419
+ const byte * end = ((const byte * )haystack_bufinfo .buf ) + haystack_bufinfo .len ;
420
+ if (n_args >= 3 && args [2 ] != mp_const_none ) {
421
+ start += mp_get_index (self_type , haystack_bufinfo .len , args [2 ], true);
422
+ }
423
+ if (n_args >= 4 && args [3 ] != mp_const_none ) {
424
+ end = ((const byte * )haystack_bufinfo .buf ) + mp_get_index (self_type , haystack_bufinfo .len , args [3 ], true);
425
+ }
426
+
427
+ const byte * p = NULL ;
428
+ if (end >= start ) {
429
+ p = find_subbytes (start , end - start , needle_bufinfo .buf , needle_bufinfo .len , direction );
430
+ }
431
+
432
+ if (p == NULL ) {
433
+ if (is_index ) {
434
+ mp_raise_ValueError (translate ("substring not found" ));
435
+ } else {
436
+ return MP_OBJ_NEW_SMALL_INT (-1 );
437
+ }
438
+ }
439
+ return MP_OBJ_NEW_SMALL_INT (p - (const byte * ) haystack_bufinfo .buf );
440
+ }
441
+
442
+ STATIC mp_obj_t buffer_find (size_t n_args , const mp_obj_t * args ) {
443
+ return buffer_finder (n_args , args , 1 , false);
444
+ }
445
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_find_obj , 2 , 4 , buffer_find );
446
+
447
+ STATIC mp_obj_t buffer_rfind (size_t n_args , const mp_obj_t * args ) {
448
+ return buffer_finder (n_args , args , -1 , false);
449
+ }
450
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_rfind_obj , 2 , 4 , buffer_rfind );
451
+
452
+ STATIC mp_obj_t buffer_index (size_t n_args , const mp_obj_t * args ) {
453
+ return buffer_finder (n_args , args , 1 , true);
454
+ }
455
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_index_obj , 2 , 4 , buffer_index );
456
+
457
+ STATIC mp_obj_t buffer_rindex (size_t n_args , const mp_obj_t * args ) {
458
+ return buffer_finder (n_args , args , -1 , true);
459
+ }
460
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (buffer_rindex_obj , 2 , 4 , buffer_rindex );
461
+ #endif
462
+
403
463
STATIC mp_obj_t array_subscr (mp_obj_t self_in , mp_obj_t index_in , mp_obj_t value ) {
404
464
if (value == MP_OBJ_NULL ) {
405
465
// delete item
@@ -580,7 +640,13 @@ STATIC MP_DEFINE_CONST_DICT(array_locals_dict, array_locals_dict_table);
580
640
STATIC const mp_rom_map_elem_t bytearray_locals_dict_table [] = {
581
641
{ MP_ROM_QSTR (MP_QSTR_append ), MP_ROM_PTR (& array_append_obj ) },
582
642
{ MP_ROM_QSTR (MP_QSTR_extend ), MP_ROM_PTR (& array_extend_obj ) },
643
+
583
644
#if MICROPY_CPYTHON_COMPAT
645
+ { MP_ROM_QSTR (MP_QSTR_find ), MP_ROM_PTR (& buffer_find_obj ) },
646
+ { MP_ROM_QSTR (MP_QSTR_rfind ), MP_ROM_PTR (& buffer_rfind_obj ) },
647
+ { MP_ROM_QSTR (MP_QSTR_index ), MP_ROM_PTR (& buffer_index_obj ) },
648
+ { MP_ROM_QSTR (MP_QSTR_rindex ), MP_ROM_PTR (& buffer_rindex_obj ) },
649
+
584
650
{ MP_ROM_QSTR (MP_QSTR_decode ), MP_ROM_PTR (& array_decode_obj ) },
585
651
#endif
586
652
};
0 commit comments