diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-14 07:53:05 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-14 07:53:05 +0000 |
commit | 268b6ddd363db2d0c59caf82b5cc8696f4ff21c6 (patch) | |
tree | 2d64a4c079f0db0a4d8d601f7910ac6ce6b0c62e /eval.c | |
parent | a1bad3acec02b1c59be59f323fe8caa2cee0c5d4 (diff) |
* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
of Contents on ppc64) is saved onto the stack by getcontext().
based on <https://bugzilla.redhat.com/show_bug.cgi?id=628715>.
Bug#4411
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@32542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 18 |
1 files changed, 14 insertions, 4 deletions
@@ -188,6 +188,9 @@ int function_call_may_return_twice_false_2 = 0; (function_call_may_return_twice_false_2 ? \ setjmp(function_call_may_return_twice_jmp_buf) : \ 0) +# elif defined(__PPC64__) +# define JUST_BEFORE_SETJMP(extra_save, j) ((void)0) +# define JUST_AFTER_SETJMP(extra_save, j) ((j)->status ? (void)0 : (extra_save)) # elif defined(__FreeBSD__) && __FreeBSD__ < 7 /* * workaround for FreeBSD/i386 getcontext/setcontext bug. @@ -205,16 +208,23 @@ static int volatile freebsd_clear_carry_flag = 0; # ifndef POST_GETCONTEXT # define POST_GETCONTEXT 0 # endif +# ifndef JUST_BEFORE_SETJMP +# define JUST_BEFORE_SETJMP(extra_save, j) (extra_save) +# endif +# ifndef JUST_AFTER_SETJMP +# define JUST_AFTER_SETJMP(extra_save, j) ((void)0) +# endif # define ruby_longjmp(env, val) rb_jump_context(env, val) -# define ruby_setjmp(just_before_setjmp, j) ((j)->status = 0, \ - (just_before_setjmp), \ +# define ruby_setjmp(extra_save, j) ((j)->status = 0, \ + JUST_BEFORE_SETJMP(extra_save, j), \ PRE_GETCONTEXT, \ getcontext(&(j)->context), \ POST_GETCONTEXT, \ + JUST_AFTER_SETJMP(extra_save, j), \ (j)->status) #else -# define ruby_setjmp(just_before_setjmp, env) \ - ((just_before_setjmp), RUBY_SETJMP(env)) +# define ruby_setjmp(extra_save, env) \ + ((extra_save), RUBY_SETJMP(env)) # define ruby_longjmp(env,val) RUBY_LONGJMP(env,val) # ifdef __CYGWIN__ # ifndef _setjmp |