py: Make sure that static emg-exc-buffer is aligned to size of mp_obj_t.
This buffer is used to allocate objects temporarily, and such objects require that their underlying memory be correctly aligned for their data type. Aligning for mp_obj_t should be sufficient for emergency exceptions, but in general the memory buffer should aligned to the maximum alignment of the machine (eg on a 32-bit machine with mp_obj_t being 4 bytes, a double may not be correctly aligned). This patch fixes a bug for certain nan-boxing builds, where mp_obj_t is 8 bytes and must be aligned to 8 bytes (even though the machine is 32 bit).
This commit is contained in:
parent
b87432b8fb
commit
ee86de1f1a
@ -120,8 +120,8 @@ typedef struct _mp_state_vm_t {
|
|||||||
// memory for exception arguments if we can't allocate RAM
|
// memory for exception arguments if we can't allocate RAM
|
||||||
#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
|
#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
|
||||||
#if MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE > 0
|
#if MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE > 0
|
||||||
// statically allocated buf
|
// statically allocated buf (needs to be aligned to mp_obj_t)
|
||||||
byte mp_emergency_exception_buf[MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE];
|
mp_obj_t mp_emergency_exception_buf[MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE / sizeof(mp_obj_t)];
|
||||||
#else
|
#else
|
||||||
// dynamically allocated buf
|
// dynamically allocated buf
|
||||||
byte *mp_emergency_exception_buf;
|
byte *mp_emergency_exception_buf;
|
||||||
|
@ -348,7 +348,7 @@ mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char
|
|||||||
tuple->items[0] = MP_OBJ_FROM_PTR(str);
|
tuple->items[0] = MP_OBJ_FROM_PTR(str);
|
||||||
|
|
||||||
byte *str_data = (byte *)&str[1];
|
byte *str_data = (byte *)&str[1];
|
||||||
uint max_len = MP_STATE_VM(mp_emergency_exception_buf) + mp_emergency_exception_buf_size
|
size_t max_len = (byte*)MP_STATE_VM(mp_emergency_exception_buf) + mp_emergency_exception_buf_size
|
||||||
- str_data;
|
- str_data;
|
||||||
|
|
||||||
vstr_t vstr;
|
vstr_t vstr;
|
||||||
@ -366,14 +366,14 @@ mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char
|
|||||||
|
|
||||||
o->args = tuple;
|
o->args = tuple;
|
||||||
|
|
||||||
uint offset = &str_data[str->len] - MP_STATE_VM(mp_emergency_exception_buf);
|
size_t offset = &str_data[str->len] - (byte*)MP_STATE_VM(mp_emergency_exception_buf);
|
||||||
offset += sizeof(void *) - 1;
|
offset += sizeof(void *) - 1;
|
||||||
offset &= ~(sizeof(void *) - 1);
|
offset &= ~(sizeof(void *) - 1);
|
||||||
|
|
||||||
if ((mp_emergency_exception_buf_size - offset) > (sizeof(o->traceback_data[0]) * 3)) {
|
if ((mp_emergency_exception_buf_size - offset) > (sizeof(o->traceback_data[0]) * 3)) {
|
||||||
// We have room to store some traceback.
|
// We have room to store some traceback.
|
||||||
o->traceback_data = (size_t*)((byte *)MP_STATE_VM(mp_emergency_exception_buf) + offset);
|
o->traceback_data = (size_t*)((byte *)MP_STATE_VM(mp_emergency_exception_buf) + offset);
|
||||||
o->traceback_alloc = (MP_STATE_VM(mp_emergency_exception_buf) + mp_emergency_exception_buf_size - (byte *)o->traceback_data) / sizeof(o->traceback_data[0]);
|
o->traceback_alloc = ((byte*)MP_STATE_VM(mp_emergency_exception_buf) + mp_emergency_exception_buf_size - (byte *)o->traceback_data) / sizeof(o->traceback_data[0]);
|
||||||
o->traceback_len = 0;
|
o->traceback_len = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user