Author: Armin Rigo <[email protected]>
Branch:
Changeset: r1316:e85ce411f190
Date: 2014-08-18 10:10 +0200
http://bitbucket.org/pypy/stmgc/changeset/e85ce411f190/
Log: Avoid one word here with the jit
diff --git a/c7/stm/rewind_setjmp.c b/c7/stm/rewind_setjmp.c
--- a/c7/stm/rewind_setjmp.c
+++ b/c7/stm/rewind_setjmp.c
@@ -37,8 +37,17 @@
size_t stack_size, ssstack_size;
assert(rjthread->head != NULL);
- stop = rjthread->head->frame_base;
ssstop = rjthread->head->shadowstack_base;
+ if (((long)ssstop) & 1) {
+ /* PyPy's JIT: 'head->frame_base' is missing; use directly 'head',
+ which should be at the end of the frame (and doesn't need itself
+ to be copied because it contains immutable data only) */
+ ssstop = ((char *)ssstop) - 1;
+ stop = (char *)rjthread->head;
+ }
+ else {
+ stop = rjthread->head->frame_base;
+ }
assert(stop >= base);
assert(ssstop <= ssbase);
stack_size = stop - base;
diff --git a/c7/stm/rewind_setjmp.h b/c7/stm/rewind_setjmp.h
--- a/c7/stm/rewind_setjmp.h
+++ b/c7/stm/rewind_setjmp.h
@@ -53,9 +53,12 @@
************************************************************/
typedef struct _rewind_jmp_buf {
- char *frame_base;
char *shadowstack_base;
struct _rewind_jmp_buf *prev;
+ char *frame_base;
+ /* NB: PyPy's JIT has got details of this structure hard-coded,
+ as follows: it uses 2 words only (so frame_base is invalid)
+ and sets the lowest bit of 'shadowstack_base' to tell this */
} rewind_jmp_buf;
typedef struct {
@@ -71,6 +74,7 @@
/* remember the current stack and ss_stack positions */
#define rewind_jmp_enterframe(rjthread, rjbuf, ss) do { \
+ assert((((long)(ss)) & 1) == 0); \
(rjbuf)->frame_base = __builtin_frame_address(0); \
(rjbuf)->shadowstack_base = (char *)(ss); \
(rjbuf)->prev = (rjthread)->head; \
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit