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:
Damien George 2015-01-01 21:47:58 +00:00
parent 0b2a60acbe
commit 8a2347723e
6 changed files with 14 additions and 56 deletions

View File

@ -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 *);

View File

@ -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);
}

View File

@ -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__))

View File

@ -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

View File

@ -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

View File

@ -108,7 +108,4 @@ nlr_jump:
ret.n
.size nlr_jump, .-nlr_jump
.local nlr_top
.comm nlr_top,4,4
#endif // defined(__xtensa__)