summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-10-26 01:02:27 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-10-26 01:03:24 +0300
commit393d0c16799a4eda787886bc0c7fce0da3c4adb8 (patch)
treeb38ca2307ea549c51a02f565ff16654202ed7409
parent79f404a287808b700e2a07826aea3338e7368498 (diff)
downloadmicropython-393d0c16799a4eda787886bc0c7fce0da3c4adb8.tar.gz
micropython-393d0c16799a4eda787886bc0c7fce0da3c4adb8.zip
extmod/moductypes: Implement buffer protocol.
This is required to write structures to files, pass to FFI functions, etc.
-rw-r--r--extmod/moductypes.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/extmod/moductypes.c b/extmod/moductypes.c
index 56da809311..21d6f451a8 100644
--- a/extmod/moductypes.c
+++ b/extmod/moductypes.c
@@ -556,6 +556,18 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
}
}
+STATIC mp_int_t uctypes_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags) {
+ (void)flags;
+ mp_obj_uctypes_struct_t *self = self_in;
+ mp_uint_t max_field_size = 0;
+ mp_uint_t size = uctypes_struct_size(self->desc, &max_field_size);
+
+ bufinfo->buf = self->addr;
+ bufinfo->len = size;
+ bufinfo->typecode = BYTEARRAY_TYPECODE;
+ return 0;
+}
+
/// \function addressof()
/// Return address of object's data (applies to object providing buffer
/// interface).
@@ -592,6 +604,7 @@ STATIC const mp_obj_type_t uctypes_struct_type = {
.make_new = uctypes_struct_make_new,
.attr = uctypes_struct_attr,
.subscr = uctypes_struct_subscr,
+ .buffer_p = { .get_buffer = uctypes_get_buffer },
};
STATIC const mp_map_elem_t mp_module_uctypes_globals_table[] = {