summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shared-bindings/busio/UART.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c
index 1b63d8d0e..9bad2468e 100644
--- a/shared-bindings/busio/UART.c
+++ b/shared-bindings/busio/UART.c
@@ -66,7 +66,11 @@ extern const busio_uart_parity_obj_t busio_uart_parity_odd_obj;
STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) {
mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true);
- busio_uart_obj_t *self = m_new_obj(busio_uart_obj_t);
+ // Always initially allocate the UART object within the long-lived heap.
+ // This is needed to avoid crashes with certain UART implementations which
+ // cannot accomodate being moved after creation. (See
+ // https://github.com/adafruit/circuitpython/issues/1056)
+ busio_uart_obj_t *self = m_new_ll_obj(busio_uart_obj_t);
self->base.type = &busio_uart_type;
mp_map_t kw_args;
mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args);