py/objarray: Add support for memoryview.itemsize attribute.
This allows figuring out the number of bytes in the memoryview object as len(memview) * memview.itemsize. The feature is enabled via MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE and is disabled by default.
This commit is contained in:
parent
38cb95710a
commit
90fae9172a
|
@ -40,6 +40,7 @@
|
|||
#define MICROPY_MODULE_GETATTR (1)
|
||||
#define MICROPY_PY_DELATTR_SETATTR (1)
|
||||
#define MICROPY_PY_REVERSE_SPECIAL_METHODS (1)
|
||||
#define MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE (1)
|
||||
#define MICROPY_PY_BUILTINS_NEXT2 (1)
|
||||
#define MICROPY_PY_BUILTINS_RANGE_BINOP (1)
|
||||
#define MICROPY_PY_BUILTINS_HELP (1)
|
||||
|
|
|
@ -856,6 +856,11 @@ typedef double mp_float_t;
|
|||
#define MICROPY_PY_BUILTINS_MEMORYVIEW (0)
|
||||
#endif
|
||||
|
||||
// Whether to support memoryview.itemsize attribute
|
||||
#ifndef MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE
|
||||
#define MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE (0)
|
||||
#endif
|
||||
|
||||
// Whether to support set object
|
||||
#ifndef MICROPY_PY_BUILTINS_SET
|
||||
#define MICROPY_PY_BUILTINS_SET (1)
|
||||
|
|
|
@ -231,6 +231,19 @@ STATIC mp_obj_t memoryview_make_new(const mp_obj_type_t *type_in, size_t n_args,
|
|||
|
||||
return MP_OBJ_FROM_PTR(self);
|
||||
}
|
||||
|
||||
#if MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE
|
||||
STATIC void memoryview_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
|
||||
if (dest[0] != MP_OBJ_NULL) {
|
||||
return;
|
||||
}
|
||||
if (attr == MP_QSTR_itemsize) {
|
||||
mp_obj_array_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
dest[0] = MP_OBJ_NEW_SMALL_INT(mp_binary_get_size('@', self->typecode & TYPECODE_MASK, NULL));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
STATIC mp_obj_t array_unary_op(mp_unary_op_t op, mp_obj_t o_in) {
|
||||
|
@ -560,6 +573,9 @@ const mp_obj_type_t mp_type_memoryview = {
|
|||
.getiter = array_iterator_new,
|
||||
.unary_op = array_unary_op,
|
||||
.binary_op = array_binary_op,
|
||||
#if MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE
|
||||
.attr = memoryview_attr,
|
||||
#endif
|
||||
.subscr = array_subscr,
|
||||
.buffer_p = { .get_buffer = array_get_buffer },
|
||||
};
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
try:
|
||||
memoryview(b'a').itemsize
|
||||
from array import array
|
||||
except:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
for code in ['b', 'h', 'i', 'l', 'q', 'f', 'd']:
|
||||
print(memoryview(array(code)).itemsize)
|
Loading…
Reference in New Issue