py/modthread: Initialise nlr_jump_callback_top on threads.

The main thread gets this because the thread state is in bss, but
subsequent threads need this field to be initialised.

Also added a note to mpstate.h to help avoid missing this in the future.

Fixes issue #12695.

This work was funded through GitHub Sponsors.

Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
This commit is contained in:
Jim Mussared 2023-10-17 12:27:49 +11:00 committed by Damien George
parent e78471416b
commit 3883f29485
2 changed files with 5 additions and 2 deletions

View File

@ -174,6 +174,7 @@ STATIC void *thread_entry(void *args_in) {
// The GC starts off unlocked on this thread. // The GC starts off unlocked on this thread.
ts.gc_lock_depth = 0; ts.gc_lock_depth = 0;
ts.nlr_jump_callback_top = NULL;
ts.mp_pending_exception = MP_OBJ_NULL; ts.mp_pending_exception = MP_OBJ_NULL;
// set locals and globals from the calling context // set locals and globals from the calling context

View File

@ -249,8 +249,10 @@ typedef struct _mp_state_vm_t {
#endif #endif
} mp_state_vm_t; } mp_state_vm_t;
// This structure holds state that is specific to a given thread. // This structure holds state that is specific to a given thread. Everything
// Everything in this structure is scanned for root pointers. // in this structure is scanned for root pointers. Anything added to this
// structure must have corresponding initialisation added to thread_entry (in
// py/modthread.c).
typedef struct _mp_state_thread_t { typedef struct _mp_state_thread_t {
// Stack top at the start of program // Stack top at the start of program
char *stack_top; char *stack_top;