aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--eval_intern.h11
-rw-r--r--vm_core.h6
3 files changed, 10 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index b687f9f94c..67c9ff7d7a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat May 18 15:49:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_core.h (rb_vm_tag): move jmpbuf between tag and prev so ensure to
+ be accessible.
+
Sat May 18 11:05:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* enumerator.c (inspect_enumerator): use VALUE instead of mere char*
diff --git a/eval_intern.h b/eval_intern.h
index 596d45ac82..190ef9195c 100644
--- a/eval_intern.h
+++ b/eval_intern.h
@@ -91,20 +91,9 @@ extern int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval
rb_fiber_start(); \
} while (0)
-/*
- ensure tag to be accessible, `buf' is at the beginning.
- the end is `prev' which is written in TH_PUSH_TAG().
-*/
-#if defined(__GNUC__) && __GNUC__ >= 4
-/* suppress -Wstrict-aliasing, and should be inlined */
-# define ENSURE_TAG_WRITABLE(tag) MEMZERO((tag).buf, int, 1)
-#else
-# define ENSURE_TAG_WRITABLE(tag) (*(volatile int *)(tag).buf = 0)
-#endif
#define TH_PUSH_TAG(th) do { \
rb_thread_t * const _th = (th); \
struct rb_vm_tag _tag; \
- ENSURE_TAG_WRITABLE(_tag); \
_tag.tag = 0; \
_tag.prev = _th->tag; \
_th->tag = &_tag;
diff --git a/vm_core.h b/vm_core.h
index 8cf3695554..71ebf73926 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -464,10 +464,14 @@ enum rb_thread_status {
typedef RUBY_JMP_BUF rb_jmpbuf_t;
+/*
+ the members which are written in TH_PUSH_TAG() should be placed at
+ the beginning and the end, so that entire region is accessible.
+*/
struct rb_vm_tag {
- rb_jmpbuf_t buf;
VALUE tag;
VALUE retval;
+ rb_jmpbuf_t buf;
struct rb_vm_tag *prev;
};