Skip to content

Commit 41459d1

Browse files
committed
handle exttype & chunk long reads
1 parent 6a76b60 commit 41459d1

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

shared-module/msgpack/__init__.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,6 @@ STATIC void pack(mp_obj_t obj, msgpack_stream_t *s, mp_obj_t default_handler) {
255255
mp_buffer_info_t bufinfo;
256256
mp_get_buffer_raise(ext->data, &bufinfo, MP_BUFFER_READ);
257257
pack_ext(s, ext->code, bufinfo.buf, bufinfo.len);
258-
} else if (MP_OBJ_IS_TYPE(obj, &mp_type_bytes)) {
259-
// bytes
260-
mp_buffer_info_t bufinfo;
261-
mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_READ);
262-
pack_bin(s, bufinfo.buf, bufinfo.len);
263258
} else if (MP_OBJ_IS_TYPE(obj, &mp_type_tuple)) {
264259
// tuple
265260
mp_obj_tuple_t *self = MP_OBJ_TO_PTR(obj);
@@ -297,7 +292,11 @@ STATIC void pack(mp_obj_t obj, msgpack_stream_t *s, mp_obj_t default_handler) {
297292
} else if (obj == mp_const_true) {
298293
write1(s, 0xc3);
299294
} else {
300-
if (default_handler != mp_const_none) {
295+
mp_buffer_info_t bufinfo;
296+
if (mp_get_buffer(obj, &bufinfo, MP_BUFFER_READ)) {
297+
// bytes (bin type)
298+
pack_bin(s, bufinfo.buf, bufinfo.len);
299+
} else if (default_handler != mp_const_none) {
301300
// set default_handler to mp_const_none to avoid infinite recursion
302301
// this also precludes some valid outputs
303302
pack(mp_call_function_1(default_handler, obj), s, mp_const_none);
@@ -332,7 +331,15 @@ STATIC mp_obj_t unpack_bytes(msgpack_stream_t *s, size_t size) {
332331
vstr_t vstr;
333332
vstr_init_len(&vstr, size);
334333
byte *p = (byte*)vstr.buf;
335-
read(s, p, size);
334+
// read in chunks: (some drivers - e.g. UART) limit the
335+
// maximum number of bytes that can be read at once
336+
// read(s, p, size);
337+
while (size > 0) {
338+
int n = size > 256 ? 256 : size;
339+
read(s, p, n);
340+
size -= n;
341+
p += n;
342+
}
336343
return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
337344
}
338345

0 commit comments

Comments
 (0)