summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-14 07:53:05 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-14 07:53:05 +0000
commit268b6ddd363db2d0c59caf82b5cc8696f4ff21c6 (patch)
tree2d64a4c079f0db0a4d8d601f7910ac6ce6b0c62e /eval.c
parenta1bad3acec02b1c59be59f323fe8caa2cee0c5d4 (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.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/eval.c b/eval.c
index 222a868b53..4d0990a54c 100644
--- a/eval.c
+++ b/eval.c
@@ -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