1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

eval_intern.h: avoid undefined behavior of setjmp

* eval_intern.h (TH_EXEC_TAG, TH_JUMP_TAG): get rid of undefined
  behavior of setjmp() in rhs of assignment expression.
  [ISO/IEC 9899:1999] 7.13.1.1

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43522 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2013-11-04 01:08:21 +00:00
parent 3566a762d2
commit 2c101190e8
2 changed files with 29 additions and 4 deletions

View file

@ -1,3 +1,9 @@
Mon Nov 4 10:08:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval_intern.h (TH_EXEC_TAG, TH_JUMP_TAG): get rid of undefined
behavior of setjmp() in rhs of assignment expression.
[ISO/IEC 9899:1999] 7.13.1.1
Sun Nov 3 23:06:51 2013 Tanaka Akira <akr@fsij.org> Sun Nov 3 23:06:51 2013 Tanaka Akira <akr@fsij.org>
* sample/test.rb: Make temporary file names unique. * sample/test.rb: Make temporary file names unique.

View file

@ -108,14 +108,33 @@ extern int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval
#define PUSH_TAG() TH_PUSH_TAG(GET_THREAD()) #define PUSH_TAG() TH_PUSH_TAG(GET_THREAD())
#define POP_TAG() TH_POP_TAG() #define POP_TAG() TH_POP_TAG()
#define TH_EXEC_TAG() ruby_setjmp(_th->tag->buf) /* clear th->state, and return the value */
static inline int
ruby_threadptr_tag_state(rb_thread_t *th)
{
int state = th->state;
th->state = 0;
return state;
}
NORETURN(static inline void ruby_threadptr_tag_jump(rb_thread_t *, int));
static inline void
ruby_threadptr_tag_jump(rb_thread_t *th, int st)
{
ruby_longjmp(th->tag->buf, (th->state = st));
}
/*
setjmp() in assignment expression rhs is undefined behavior
[ISO/IEC 9899:1999] 7.13.1.1
*/
#define TH_EXEC_TAG() \
(ruby_setjmp(_th->tag->buf) ? ruby_threadptr_tag_state(_th) : 0)
#define EXEC_TAG() \ #define EXEC_TAG() \
TH_EXEC_TAG() TH_EXEC_TAG()
#define TH_JUMP_TAG(th, st) do { \ #define TH_JUMP_TAG(th, st) ruby_threadptr_tag_jump(th, st)
ruby_longjmp((th)->tag->buf,(st)); \
} while (0)
#define JUMP_TAG(st) TH_JUMP_TAG(GET_THREAD(), (st)) #define JUMP_TAG(st) TH_JUMP_TAG(GET_THREAD(), (st))