summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-04-19 05:31:58 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-04-19 05:31:58 +0000
commit0d6f4f36682f5dd9d8932e931104ba40f0325ed0 (patch)
tree15cf4bf24244d6f071ec62804d68e1f70c082987
parent7a45568809251ea36af73a070f75925feae973a7 (diff)
* eval.c (ruby_cleanup): the order of local variables on stack is
undefined. should use outermost VALUE for ruby_init_stack. * gc.c (rb_stack_growup_p): returns stack grows up. * gc.c (Init_stack, ruby_init_stack): allows volatile pointer. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@23209 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog9
-rw-r--r--eval.c11
-rw-r--r--gc.c17
-rw-r--r--ruby.h6
-rw-r--r--version.h6
5 files changed, 37 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 86b7fdac14..f3d140a56b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Sun Apr 19 14:31:57 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (ruby_cleanup): the order of local variables on stack is
+ undefined. should use outermost VALUE for ruby_init_stack.
+
+ * gc.c (rb_stack_growup_p): returns stack grows up.
+
+ * gc.c (Init_stack, ruby_init_stack): allows volatile pointer.
+
Sat Apr 18 19:44:53 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (safe_mutex_lock): pthread_cleanup_push() must not be
diff --git a/eval.c b/eval.c
index e2c3bf1f71..9ab9880372 100644
--- a/eval.c
+++ b/eval.c
@@ -95,6 +95,15 @@ char *strrchr _((const char*,const char));
#include "vmsruby_private.h"
#endif
+#if STACK_GROW_DIRECTION > 0
+# define STACK_UPPER(x, a, b) a
+#elif STACK_GROW_DIRECTION < 0
+# define STACK_UPPER(x, a, b) b
+#else
+int rb_stack_growup_p _((VALUE *addr));
+# define STACK_UPPER(x, a, b) (rb_stack_growup_p(x) ? a : b)
+#endif
+
#ifdef USE_CONTEXT
NORETURN(static void rb_jump_context(rb_jmpbuf_t, int));
@@ -1620,7 +1629,7 @@ ruby_cleanup(ex)
errs[1] = ruby_errinfo;
ruby_safe_level = 0;
- ruby_init_stack((void *)&state);
+ ruby_init_stack(&errs[STACK_UPPER(errs, 0, 1)]);
PUSH_THREAD_TAG();
PUSH_ITER(ITER_NOT);
if ((state = EXEC_TAG()) == 0) {
diff --git a/gc.c b/gc.c
index c194d92288..1dc5983811 100644
--- a/gc.c
+++ b/gc.c
@@ -533,7 +533,7 @@ stack_end_address(VALUE **stack_end_p)
static int grow_direction;
static int
stack_grow_direction(addr)
- VALUE *addr;
+ volatile VALUE *addr;
{
SET_STACK_END;
@@ -542,6 +542,13 @@ stack_grow_direction(addr)
}
# define stack_growup_p(x) ((grow_direction ? grow_direction : stack_grow_direction(x)) > 0)
# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? a : b)
+
+int
+rb_stack_growup_p(addr)
+ volatile VALUE *addr;
+{
+ return stack_growup_p(addr);
+}
#endif
#define GC_WATER_MARK 512
@@ -1570,7 +1577,7 @@ ruby_set_stack_size(size)
void
Init_stack(addr)
- VALUE *addr;
+ volatile VALUE *addr;
{
ruby_init_stack(addr);
}
@@ -1583,16 +1590,16 @@ ruby_init_stack(addr
, bsp
#endif
)
- VALUE *addr;
+ volatile VALUE *addr;
#ifdef __ia64
void *bsp;
#endif
{
if (!rb_gc_stack_start ||
STACK_UPPER(&addr,
- rb_gc_stack_start > addr,
+ addr && rb_gc_stack_start > addr,
rb_gc_stack_start < addr)) {
- rb_gc_stack_start = addr;
+ rb_gc_stack_start = (VALUE *)addr;
}
#ifdef __ia64
if (!rb_gc_register_stack_start ||
diff --git a/ruby.h b/ruby.h
index eebd5b2851..c13da1dfd1 100644
--- a/ruby.h
+++ b/ruby.h
@@ -594,14 +594,14 @@ NORETURN(void rb_throw _((const char*,VALUE)));
VALUE rb_require _((const char*));
#ifdef __ia64
-void ruby_init_stack(VALUE*, void*);
+void ruby_init_stack(volatile VALUE*, void*);
#define ruby_init_stack(addr) ruby_init_stack(addr, rb_ia64_bsp())
#else
-void ruby_init_stack(VALUE*);
+void ruby_init_stack(volatile VALUE*);
#endif
#define Init_stack(addr) ruby_init_stack(addr)
#define RUBY_INIT_STACK \
- VALUE variable_in_this_stack_frame; \
+ volatile VALUE variable_in_this_stack_frame; \
ruby_init_stack(&variable_in_this_stack_frame);
void ruby_init _((void));
diff --git a/version.h b/version.h
index 253537d2ba..06fdc8771c 100644
--- a/version.h
+++ b/version.h
@@ -1,7 +1,7 @@
#define RUBY_VERSION "1.8.8"
-#define RUBY_RELEASE_DATE "2009-04-18"
+#define RUBY_RELEASE_DATE "2009-04-19"
#define RUBY_VERSION_CODE 188
-#define RUBY_RELEASE_CODE 20090418
+#define RUBY_RELEASE_CODE 20090419
#define RUBY_PATCHLEVEL -1
#define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 8
#define RUBY_RELEASE_YEAR 2009
#define RUBY_RELEASE_MONTH 4
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_DAY 19
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];