summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstijn <stijn@ignitron.net>2019-05-08 16:16:17 +0200
committerDamien George <damien.p.george@gmail.com>2019-05-14 17:15:17 +1000
commit90fae9172a67f44e1fac967f628f26ddf90da963 (patch)
treebd6b6fabc10c1e0cd8100494860ffa722698ca03
parent38cb95710a97fe65e901043ff435d4e3a90530e4 (diff)
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.
-rw-r--r--ports/unix/mpconfigport_coverage.h1
-rw-r--r--py/mpconfig.h5
-rw-r--r--py/objarray.c16
-rw-r--r--tests/basics/memoryview_itemsize.py9
4 files changed, 31 insertions, 0 deletions
diff --git a/ports/unix/mpconfigport_coverage.h b/ports/unix/mpconfigport_coverage.h
index f3fbee6bf..b2f1d6e88 100644
--- a/ports/unix/mpconfigport_coverage.h
+++ b/ports/unix/mpconfigport_coverage.h
@@ -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)
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 38b36a4b1..2d857d8f6 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -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)
diff --git a/py/objarray.c b/py/objarray.c
index 02f6dff52..89d2f2180 100644
--- a/py/objarray.c
+++ b/py/objarray.c
@@ -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 },
};
diff --git a/tests/basics/memoryview_itemsize.py b/tests/basics/memoryview_itemsize.py
new file mode 100644
index 000000000..108c69cfd
--- /dev/null
+++ b/tests/basics/memoryview_itemsize.py
@@ -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)