@@ -88,19 +88,20 @@ STATIC mp_obj_t array_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const m
8888 return array_construct (* typecode , args [1 ]);
8989}
9090
91- // This is top-level factory function, not virtual method
92- // TODO: "bytearray" really should be type, not function
93- STATIC mp_obj_t mp_builtin_bytearray (mp_obj_t arg ) {
94- if (MP_OBJ_IS_SMALL_INT (arg )) {
95- uint len = MP_OBJ_SMALL_INT_VALUE (arg );
91+ STATIC mp_obj_t bytearray_make_new (mp_obj_t type_in , uint n_args , uint n_kw , const mp_obj_t * args ) {
92+ if (n_args > 1 ) {
93+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_TypeError , "unexpected # of arguments, %d given" , n_args ));
94+ }
95+
96+ if (MP_OBJ_IS_SMALL_INT (args [0 ])) {
97+ uint len = MP_OBJ_SMALL_INT_VALUE (args [0 ]);
9698 mp_obj_array_t * o = array_new (BYTEARRAY_TYPECODE , len );
9799 memset (o -> items , 0 , len );
98100 return o ;
99101 }
100102
101- return array_construct (BYTEARRAY_TYPECODE , arg );
103+ return array_construct (BYTEARRAY_TYPECODE , args [ 0 ] );
102104}
103- MP_DEFINE_CONST_FUN_OBJ_1 (mp_builtin_bytearray_obj , mp_builtin_bytearray );
104105
105106STATIC mp_obj_t array_unary_op (int op , mp_obj_t o_in ) {
106107 mp_obj_array_t * o = o_in ;
@@ -127,7 +128,7 @@ STATIC mp_obj_t array_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
127128}
128129
129130STATIC mp_obj_t array_append (mp_obj_t self_in , mp_obj_t arg ) {
130- assert (MP_OBJ_IS_TYPE (self_in , & mp_type_array ));
131+ assert (MP_OBJ_IS_TYPE (self_in , & mp_type_array ) || MP_OBJ_IS_TYPE ( self_in , & mp_type_bytearray ) );
131132 mp_obj_array_t * self = self_in ;
132133 if (self -> free == 0 ) {
133134 int item_sz = mp_binary_get_size (self -> typecode );
@@ -174,9 +175,22 @@ const mp_obj_type_t mp_type_array = {
174175 .locals_dict = (mp_obj_t )& array_locals_dict ,
175176};
176177
178+ const mp_obj_type_t mp_type_bytearray = {
179+ { & mp_type_type },
180+ .name = MP_QSTR_bytearray ,
181+ .print = array_print ,
182+ .make_new = bytearray_make_new ,
183+ .getiter = array_iterator_new ,
184+ .unary_op = array_unary_op ,
185+ .binary_op = array_binary_op ,
186+ .store_item = array_store_item ,
187+ .buffer_p = { .get_buffer = array_get_buffer },
188+ .locals_dict = (mp_obj_t )& array_locals_dict ,
189+ };
190+
177191STATIC mp_obj_array_t * array_new (char typecode , uint n ) {
178192 mp_obj_array_t * o = m_new_obj (mp_obj_array_t );
179- o -> base .type = & mp_type_array ;
193+ o -> base .type = ( typecode == BYTEARRAY_TYPECODE ) ? & mp_type_bytearray : & mp_type_array ;
180194 o -> typecode = typecode ;
181195 o -> free = 0 ;
182196 o -> len = n ;
0 commit comments