@@ -490,38 +490,51 @@ STATIC mp_obj_t int_from_bytes(size_t n_args, const mp_obj_t *args) {
490
490
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (int_from_bytes_fun_obj , 3 , 4 , int_from_bytes );
491
491
STATIC MP_DEFINE_CONST_CLASSMETHOD_OBJ (int_from_bytes_obj , MP_ROM_PTR (& int_from_bytes_fun_obj ));
492
492
493
- STATIC mp_obj_t int_to_bytes (size_t n_args , const mp_obj_t * args ) {
494
- // TODO: Support signed param (assumes signed=False)
495
- (void )n_args ;
496
-
497
- mp_int_t len = mp_obj_get_int (args [1 ]);
493
+ STATIC mp_obj_t int_to_bytes (size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
494
+ enum { ARG_length , ARG_byteorder , ARG_signed };
495
+ static const mp_arg_t allowed_args [] = {
496
+ { MP_QSTR_length , MP_ARG_REQUIRED | MP_ARG_INT },
497
+ { MP_QSTR_byteorder , MP_ARG_REQUIRED | MP_ARG_OBJ },
498
+ { MP_QSTR_signed , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
499
+ };
500
+ mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
501
+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
502
+
503
+ mp_int_t len = args [ARG_length ].u_int ;
498
504
if (len < 0 ) {
499
505
mp_raise_ValueError (NULL );
500
506
}
501
- bool big_endian = args [2 ] != MP_OBJ_NEW_QSTR (MP_QSTR_little );
507
+
508
+ mp_obj_t self = pos_args [0 ];
509
+ bool big_endian = args [ARG_byteorder ].u_obj != MP_OBJ_NEW_QSTR (MP_QSTR_little );
510
+ bool signed_ = args [ARG_signed ].u_bool ;
502
511
503
512
vstr_t vstr ;
504
513
vstr_init_len (& vstr , len );
505
514
byte * data = (byte * )vstr .buf ;
506
515
memset (data , 0 , len );
507
516
508
517
#if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE
509
- if (!MP_OBJ_IS_SMALL_INT (args [ 0 ] )) {
510
- mp_obj_int_buffer_overflow_check (args [ 0 ] , len , false );
511
- mp_obj_int_to_bytes_impl (args [ 0 ] , big_endian , len , data );
518
+ if (!MP_OBJ_IS_SMALL_INT (self )) {
519
+ mp_obj_int_buffer_overflow_check (self , len , signed_ );
520
+ mp_obj_int_to_bytes_impl (self , big_endian , len , data );
512
521
} else
513
522
#endif
514
523
{
515
- mp_int_t val = MP_OBJ_SMALL_INT_VALUE (args [ 0 ] );
524
+ mp_int_t val = MP_OBJ_SMALL_INT_VALUE (self );
516
525
// Small int checking is separate, to be fast.
517
- mp_small_int_buffer_overflow_check (val , len , false );
526
+ mp_small_int_buffer_overflow_check (val , len , signed_ );
518
527
size_t l = MIN ((size_t )len , sizeof (val ));
528
+ if (val < 0 ) {
529
+ // Sign extend negative numbers.
530
+ memset (data , -1 , len );
531
+ }
519
532
mp_binary_set_int (l , big_endian , data + (big_endian ? (len - l ) : 0 ), val );
520
533
}
521
534
522
535
return mp_obj_new_str_from_vstr (& mp_type_bytes , & vstr );
523
536
}
524
- STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (int_to_bytes_obj , 3 , 4 , int_to_bytes );
537
+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (int_to_bytes_obj , 3 , int_to_bytes );
525
538
526
539
STATIC const mp_rom_map_elem_t int_locals_dict_table [] = {
527
540
{ MP_ROM_QSTR (MP_QSTR_from_bytes ), MP_ROM_PTR (& int_from_bytes_obj ) },
0 commit comments