py: Move global variable nlr_top to one place, in a .c file.
This reduces dependency on assembler, and allows to consolidate global variables in the future.
This commit is contained in:
parent
0b2a60acbe
commit
8a2347723e
7
py/nlr.h
7
py/nlr.h
@ -64,13 +64,14 @@ struct _nlr_buf_t {
|
||||
#endif
|
||||
};
|
||||
|
||||
extern nlr_buf_t *nlr_top;
|
||||
|
||||
#if MICROPY_NLR_SETJMP
|
||||
extern nlr_buf_t *nlr_setjmp_top;
|
||||
NORETURN void nlr_setjmp_jump(void *val);
|
||||
// nlr_push() must be defined as a macro, because "The stack context will be
|
||||
// invalidated if the function which called setjmp() returns."
|
||||
#define nlr_push(buf) ((buf)->prev = nlr_setjmp_top, nlr_setjmp_top = (buf), setjmp((buf)->jmpbuf))
|
||||
#define nlr_pop() { nlr_setjmp_top = nlr_setjmp_top->prev; }
|
||||
#define nlr_push(buf) ((buf)->prev = nlr_top, nlr_top = (buf), setjmp((buf)->jmpbuf))
|
||||
#define nlr_pop() { nlr_top = nlr_top->prev; }
|
||||
#define nlr_jump(val) nlr_setjmp_jump(val)
|
||||
#else
|
||||
unsigned int nlr_push(nlr_buf_t *);
|
||||
|
@ -26,13 +26,14 @@
|
||||
|
||||
#include "py/nlr.h"
|
||||
|
||||
// this global variable is used for all nlr implementations
|
||||
nlr_buf_t *nlr_top;
|
||||
|
||||
#if MICROPY_NLR_SETJMP
|
||||
|
||||
nlr_buf_t *nlr_setjmp_top;
|
||||
|
||||
void nlr_setjmp_jump(void *val) {
|
||||
nlr_buf_t *buf = nlr_setjmp_top;
|
||||
nlr_setjmp_top = buf->prev;
|
||||
nlr_buf_t *buf = nlr_top;
|
||||
nlr_top = buf->prev;
|
||||
buf->ret_val = val;
|
||||
longjmp(buf->jmpbuf, 1);
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ nlr_push:
|
||||
str r11, [r0, #40] @ store r11 into nlr_buf
|
||||
str r13, [r0, #44] @ store r13=sp into nlr_buf
|
||||
|
||||
ldr r3, .L2 @ load addr of nlr_top
|
||||
ldr r3, nlr_top_addr @ load addr of nlr_top
|
||||
ldr r2, [r3] @ load nlr_top
|
||||
str r2, [r0] @ store nlr_top into nlr_buf
|
||||
str r0, [r3] @ store nlr_buf into nlr_top (to link list)
|
||||
@ -67,8 +67,8 @@ nlr_push:
|
||||
movs r0, #0 @ return 0, normal return
|
||||
bx lr @ return
|
||||
.align 2
|
||||
.L2:
|
||||
.word .LANCHOR0
|
||||
nlr_top_addr:
|
||||
.word nlr_top
|
||||
.size nlr_push, .-nlr_push
|
||||
|
||||
/**************************************/
|
||||
@ -81,14 +81,11 @@ nlr_push:
|
||||
#endif
|
||||
.type nlr_pop, %function
|
||||
nlr_pop:
|
||||
ldr r3, .L5 @ load addr of nlr_top
|
||||
ldr r3, nlr_top_addr @ load addr of nlr_top
|
||||
ldr r2, [r3] @ load nlr_top
|
||||
ldr r2, [r2] @ load prev nlr_buf
|
||||
str r2, [r3] @ store prev nlr_buf to nlr_top (to unlink list)
|
||||
bx lr @ return
|
||||
.align 2
|
||||
.L5:
|
||||
.word .LANCHOR0
|
||||
.size nlr_pop, .-nlr_pop
|
||||
|
||||
/**************************************/
|
||||
@ -101,7 +98,7 @@ nlr_pop:
|
||||
#endif
|
||||
.type nlr_jump, %function
|
||||
nlr_jump:
|
||||
ldr r3, .L2 @ load addr of nlr_top
|
||||
ldr r3, nlr_top_addr @ load addr of nlr_top
|
||||
ldr r2, [r3] @ load nlr_top
|
||||
cmp r2, #0 @ test if nlr_top is NULL
|
||||
beq nlr_jump_fail @ if nlr_top is NULL, transfer control to nlr_jump_fail
|
||||
@ -122,20 +119,6 @@ nlr_jump:
|
||||
|
||||
movs r0, #1 @ return 1, non-local return
|
||||
bx lr @ return
|
||||
.align 2
|
||||
.L6:
|
||||
.word .LANCHOR0
|
||||
.size nlr_jump, .-nlr_jump
|
||||
|
||||
/**************************************/
|
||||
// local variable nlr_top
|
||||
|
||||
.bss
|
||||
.align 2
|
||||
.set .LANCHOR0,. + 0
|
||||
.type nlr_top, %object
|
||||
.size nlr_top, 4
|
||||
nlr_top:
|
||||
.space 4
|
||||
|
||||
#endif // (!defined(MICROPY_NLR_SETJMP) || !MICROPY_NLR_SETJMP) && (defined(__thumb2__) || defined(__thumb__) || defined(__arm__))
|
||||
|
15
py/nlrx64.S
15
py/nlrx64.S
@ -131,15 +131,6 @@ nlr_jump:
|
||||
je _nlr_jump_fail # transfer control to nlr_jump_fail
|
||||
#endif
|
||||
|
||||
/**************************************/
|
||||
// local variable nlr_top
|
||||
|
||||
#if !(defined(__APPLE__) && defined(__MACH__))
|
||||
.bss
|
||||
.local nlr_top
|
||||
#endif
|
||||
.comm nlr_top,8,8
|
||||
|
||||
#else // !defined(__CYGWIN__)
|
||||
|
||||
/******************************************************************************/
|
||||
@ -210,12 +201,6 @@ nlr_jump:
|
||||
movq %rax, %rcx # put argument back in first-arg register
|
||||
je nlr_jump_fail # transfer control to nlr_jump_fail
|
||||
|
||||
/**************************************/
|
||||
// local variable nlr_top
|
||||
|
||||
.bss
|
||||
.comm nlr_top,8,8
|
||||
|
||||
#endif // !defined(__CYGWIN__)
|
||||
|
||||
#endif // defined(__x86_64__) && !MICROPY_NLR_SETJMP
|
||||
|
@ -121,13 +121,4 @@ nlr_jump:
|
||||
.size nlr_jump, .-nlr_jump
|
||||
#endif
|
||||
|
||||
/**************************************/
|
||||
// local variable nlr_top
|
||||
|
||||
.bss
|
||||
#ifndef _WIN32
|
||||
.local nlr_top
|
||||
#endif
|
||||
.comm nlr_top,4,4
|
||||
|
||||
#endif // defined(__i386__) && !MICROPY_NLR_SETJMP
|
||||
|
@ -108,7 +108,4 @@ nlr_jump:
|
||||
ret.n
|
||||
.size nlr_jump, .-nlr_jump
|
||||
|
||||
.local nlr_top
|
||||
.comm nlr_top,4,4
|
||||
|
||||
#endif // defined(__xtensa__)
|
||||
|
Loading…
Reference in New Issue
Block a user