STATIC mp_obj_t array_construct(char typecode, mp_obj_t initializer) { uint len; // Try to create array of exact len if initializer len is known mp_obj_t len_in = mp_obj_len_maybe(initializer); if (len_in == MP_OBJ_NULL) { len = 0; } else { len = MP_OBJ_SMALL_INT_VALUE(len_in); } mp_obj_array_t *array = array_new(typecode, len); mp_obj_t iterable = rt_getiter(initializer); mp_obj_t item; int i = 0; while ((item = rt_iternext(iterable)) != mp_const_stop_iteration) { if (len == 0) { array_append(array, item); } else { mp_binary_set_val(typecode, array->items, i++, item); } } return array; }
STATIC mp_obj_t array_append(mp_obj_t self_in, mp_obj_t arg) { assert(MP_OBJ_IS_TYPE(self_in, &array_type)); mp_obj_array_t *self = self_in; if (self->free == 0) { int item_sz = mp_binary_get_size(self->typecode); // TODO: alloc policy self->free = 8; self->items = m_realloc(self->items, item_sz * self->len, item_sz * (self->len + self->free)); } mp_binary_set_val(self->typecode, self->items, self->len++, arg); self->free--; return mp_const_none; // return None, as per CPython }
STATIC mp_obj_t struct_pack(uint n_args, mp_obj_t *args) { // TODO: "The arguments must match the values required by the format exactly." const char *fmt = mp_obj_str_get_str(args[0]); char fmt_type = get_fmt_type(&fmt); int size = MP_OBJ_SMALL_INT_VALUE(struct_calcsize(args[0])); byte *p; mp_obj_t res = mp_obj_str_builder_start(&mp_type_bytes, size, &p); memset(p, 0, size); for (uint i = 1; i < n_args; i++) { machine_uint_t sz = 1; if (unichar_isdigit(*fmt)) { sz = get_fmt_num(&fmt); } if (sz > 1) { // TODO: size spec support only for string len assert(*fmt == 's'); } if (*fmt == 's') { mp_buffer_info_t bufinfo; mp_get_buffer_raise(args[i], &bufinfo, MP_BUFFER_READ); machine_uint_t to_copy = sz; if (bufinfo.len < to_copy) { to_copy = bufinfo.len; } memcpy(p, bufinfo.buf, to_copy); memset(p + to_copy, 0, sz - to_copy); p += sz; fmt++; } else { mp_binary_set_val(fmt_type, *fmt++, args[i], &p); } } return res; }
STATIC mp_obj_t ffivar_set(mp_obj_t self_in, mp_obj_t val_in) { mp_obj_ffivar_t *self = self_in; mp_binary_set_val(self->type, self->var, 0, val_in); return mp_const_none; }
STATIC bool array_store_item(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) { mp_obj_array_t *o = self_in; uint index = mp_get_index(o->base.type, o->len, index_in); mp_binary_set_val(o->typecode, o->items, index, value); return true; }