Skip to content

Commit cb0fc06

Browse files
committed
objmemoryview: Introduce mp_obj_new_memoryview().
This follows existing pattern for object constructor API and allows to create memoryview objects e.g. in external modules.
1 parent 24c1000 commit cb0fc06

2 files changed

Lines changed: 15 additions & 6 deletions

File tree

py/obj.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ mp_obj_t mp_obj_new_super(mp_obj_t type, mp_obj_t obj);
430430
mp_obj_t mp_obj_new_bound_meth(mp_obj_t meth, mp_obj_t self);
431431
mp_obj_t mp_obj_new_getitem_iter(mp_obj_t *args);
432432
mp_obj_t mp_obj_new_module(qstr module_name);
433+
mp_obj_t mp_obj_new_memoryview(byte typecode, mp_uint_t nitems, void *items);
433434

434435
mp_obj_type_t *mp_obj_get_type(mp_const_obj_t o_in);
435436
const char *mp_obj_get_type_str(mp_const_obj_t o_in);

py/objarray.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,17 @@ STATIC mp_obj_t bytearray_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t
208208
#endif
209209

210210
#if MICROPY_PY_BUILTINS_MEMORYVIEW
211+
212+
mp_obj_t mp_obj_new_memoryview(byte typecode, mp_uint_t nitems, void *items) {
213+
mp_obj_array_t *self = m_new_obj(mp_obj_array_t);
214+
self->base.type = &mp_type_memoryview;
215+
self->typecode = typecode;
216+
self->free = 0;
217+
self->len = nitems;
218+
self->items = items;
219+
return self;
220+
}
221+
211222
STATIC mp_obj_t memoryview_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
212223
// TODO possibly allow memoryview constructor to take start/stop so that one
213224
// can do memoryview(b, 4, 8) instead of memoryview(b)[4:8] (uses less RAM)
@@ -217,12 +228,9 @@ STATIC mp_obj_t memoryview_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_
217228
mp_buffer_info_t bufinfo;
218229
mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
219230

220-
mp_obj_array_t *self = m_new_obj(mp_obj_array_t);
221-
self->base.type = type_in;
222-
self->typecode = bufinfo.typecode;
223-
self->free = 0;
224-
self->len = bufinfo.len / mp_binary_get_size('@', bufinfo.typecode, NULL); // element len
225-
self->items = bufinfo.buf;
231+
mp_obj_array_t *self = mp_obj_new_memoryview(bufinfo.typecode,
232+
bufinfo.len / mp_binary_get_size('@', bufinfo.typecode, NULL),
233+
bufinfo.buf);
226234

227235
// test if the object can be written to
228236
if (mp_get_buffer(args[0], &bufinfo, MP_BUFFER_RW)) {

0 commit comments

Comments
 (0)