Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
eeffbb69
Commit
eeffbb69
authored
Apr 17, 2014
by
Damien George
Browse files
Merge pull request #507 from pfalcon/nlr-setjmp
nlr: Add implementation using setjmp/longjmp.
parents
594d0ddb
3a83b805
Changes
3
Hide whitespace changes
Inline
Side-by-side
py/nlr.h
View file @
eeffbb69
...
...
@@ -2,12 +2,14 @@
// exception handling, basically a stack of setjmp/longjmp buffers
#include
<limits.h>
#include
<setjmp.h>
typedef
struct
_nlr_buf_t
nlr_buf_t
;
struct
_nlr_buf_t
{
// the entries here must all be machine word size
nlr_buf_t
*
prev
;
void
*
ret_val
;
#if !MICROPY_NLR_SETJMP
#if defined(__i386__)
void
*
regs
[
6
];
#elif defined(__x86_64__)
...
...
@@ -19,13 +21,29 @@ struct _nlr_buf_t {
#elif defined(__thumb2__)
void
*
regs
[
10
];
#else
#error Unknown arch in nlr.h
#define MICROPY_NLR_SETJMP (1)
#warning "No native NLR support for this arch, using setjmp implementation"
#endif
#endif
#if MICROPY_NLR_SETJMP
jmp_buf
jmpbuf
;
#endif
};
#if MICROPY_NLR_SETJMP
extern
nlr_buf_t
*
nlr_setjmp_top
;
void
nlr_setjmp_jump
(
void
*
val
)
__attribute__
((
noreturn
));
// 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_jump(val) nlr_setjmp_jump(val)
#else
unsigned
int
nlr_push
(
nlr_buf_t
*
);
void
nlr_pop
(
void
);
void
nlr_jump
(
void
*
val
)
__attribute__
((
noreturn
));
#endif
// This must be implemented by a port. It's called by nlr_jump
// if no nlr buf has been pushed. It must not return, but rather
...
...
py/nlrsetjmp.c
0 → 100644
View file @
eeffbb69
#include
<setjmp.h>
#include
<stdio.h>
#include
"nlr.h"
#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
;
buf
->
ret_val
=
val
;
longjmp
(
buf
->
jmpbuf
,
1
);
}
#endif
py/py.mk
View file @
eeffbb69
...
...
@@ -10,6 +10,7 @@ PY_O_BASENAME = \
nlrx86.o
\
nlrx64.o
\
nlrthumb.o
\
nlrsetjmp.o
\
malloc.o
\
gc.o
\
qstr.o
\
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment