diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2016-07-07 02:16:24 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2016-07-07 02:16:24 +0300 |
commit | a4c8a1ffe86ace0b4394d751a2d3716f7d865ba6 (patch) | |
tree | 63c1d0931b256b283671ed40f43aa6f450525ab7 | |
parent | ec7fe925312845f788590ce5ccb2a8b3a18a0486 (diff) | |
download | micropython-a4c8a1ffe86ace0b4394d751a2d3716f7d865ba6.tar.gz micropython-a4c8a1ffe86ace0b4394d751a2d3716f7d865ba6.zip |
extmod/moduos_dupterm: Reuse dupterm_arr_obj for write operations.
Instead of allocating new array object header again and again, causing
memory fragmentation.
-rw-r--r-- | extmod/moduos_dupterm.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/extmod/moduos_dupterm.c b/extmod/moduos_dupterm.c index 66ca22ff95..d888099dff 100644 --- a/extmod/moduos_dupterm.c +++ b/extmod/moduos_dupterm.c @@ -31,6 +31,7 @@ #include "py/nlr.h" #include "py/runtime.h" #include "py/objtuple.h" +#include "py/objarray.h" #include "py/stream.h" #if MICROPY_PY_OS_DUPTERM @@ -51,8 +52,16 @@ void mp_uos_dupterm_tx_strn(const char *str, size_t len) { if (nlr_push(&nlr) == 0) { mp_obj_t write_m[3]; mp_load_method(MP_STATE_PORT(term_obj), MP_QSTR_write, write_m); - write_m[2] = mp_obj_new_bytearray_by_ref(len, (char*)str); + + mp_obj_array_t *arr = MP_OBJ_TO_PTR(MP_STATE_PORT(dupterm_arr_obj)); + void *org_items = arr->items; + arr->items = (void*)str; + arr->len = len; + write_m[2] = MP_STATE_PORT(dupterm_arr_obj); mp_call_method_n_kw(1, 0, write_m); + arr = MP_OBJ_TO_PTR(MP_STATE_PORT(dupterm_arr_obj)); + arr->items = org_items; + arr->len = 1; nlr_pop(); } else { mp_uos_deactivate("dupterm: Exception in write() method, deactivating: ", nlr.ret_val); |