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:
parent
3566a762d2
commit
2c101190e8
2 changed files with 29 additions and 4 deletions
|
@ -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.
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue