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_MODULE_GETATTR (1)
|
||||||
#define MICROPY_PY_DELATTR_SETATTR (1)
|
#define MICROPY_PY_DELATTR_SETATTR (1)
|
||||||
#define MICROPY_PY_REVERSE_SPECIAL_METHODS (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_NEXT2 (1)
|
||||||
#define MICROPY_PY_BUILTINS_RANGE_BINOP (1)
|
#define MICROPY_PY_BUILTINS_RANGE_BINOP (1)
|
||||||
#define MICROPY_PY_BUILTINS_HELP (1)
|
#define MICROPY_PY_BUILTINS_HELP (1)
|
||||||
|
|
|
@ -856,6 +856,11 @@ typedef double mp_float_t;
|
||||||
#define MICROPY_PY_BUILTINS_MEMORYVIEW (0)
|
#define MICROPY_PY_BUILTINS_MEMORYVIEW (0)
|
||||||
#endif
|
#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
|
// Whether to support set object
|
||||||
#ifndef MICROPY_PY_BUILTINS_SET
|
#ifndef MICROPY_PY_BUILTINS_SET
|
||||||
#define MICROPY_PY_BUILTINS_SET (1)
|
#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);
|
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
|
#endif
|
||||||
|
|
||||||
STATIC mp_obj_t array_unary_op(mp_unary_op_t op, mp_obj_t o_in) {
|
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,
|
.getiter = array_iterator_new,
|
||||||
.unary_op = array_unary_op,
|
.unary_op = array_unary_op,
|
||||||
.binary_op = array_binary_op,
|
.binary_op = array_binary_op,
|
||||||
|
#if MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE
|
||||||
|
.attr = memoryview_attr,
|
||||||
|
#endif
|
||||||
.subscr = array_subscr,
|
.subscr = array_subscr,
|
||||||
.buffer_p = { .get_buffer = array_get_buffer },
|
.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