From 8a2347723eba9899a12799021b4e47bd1fa20282 Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 1 Jan 2015 21:47:58 +0000 Subject: [PATCH] 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. --- py/nlr.h | 7 ++++--- py/nlrsetjmp.c | 9 +++++---- py/nlrthumb.S | 27 +++++---------------------- py/nlrx64.S | 15 --------------- py/nlrx86.S | 9 --------- py/nlrxtensa.S | 3 --- 6 files changed, 14 insertions(+), 56 deletions(-) diff --git a/py/nlr.h b/py/nlr.h index ae9ca1a777..824ed6dd69 100644 --- a/py/nlr.h +++ b/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 *); diff --git a/py/nlrsetjmp.c b/py/nlrsetjmp.c index 176138db04..76d718bba5 100644 --- a/py/nlrsetjmp.c +++ b/py/nlrsetjmp.c @@ -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); } diff --git a/py/nlrthumb.S b/py/nlrthumb.S index dcbcc2770d..761f835566 100644 --- a/py/nlrthumb.S +++ b/py/nlrthumb.S @@ -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__)) diff --git a/py/nlrx64.S b/py/nlrx64.S index d00102050b..b0c2e74452 100644 --- a/py/nlrx64.S +++ b/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 diff --git a/py/nlrx86.S b/py/nlrx86.S index 8ce93f227b..7d12d38933 100644 --- a/py/nlrx86.S +++ b/py/nlrx86.S @@ -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 diff --git a/py/nlrxtensa.S b/py/nlrxtensa.S index 083215a184..293fb9f0a5 100644 --- a/py/nlrxtensa.S +++ b/py/nlrxtensa.S @@ -108,7 +108,4 @@ nlr_jump: ret.n .size nlr_jump, .-nlr_jump - .local nlr_top - .comm nlr_top,4,4 - #endif // defined(__xtensa__)