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

use TH_JUMP_TAG

* vm_eval.c (rb_eval_cmd, rb_catch_obj): use TH_JUMP_TAG with the
  same rb_thread_t used for TH_PUSH_TAG, instead of JUMP_TAG with
  the current thread global variable.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-05-05 03:22:20 +00:00
parent 77421bcc58
commit 84f94652b0
11 changed files with 48 additions and 33 deletions

View file

@ -1,3 +1,9 @@
Thu May 5 12:22:17 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_eval.c (rb_eval_cmd, rb_catch_obj): use TH_JUMP_TAG with the
same rb_thread_t used for TH_PUSH_TAG, instead of JUMP_TAG with
the current thread global variable.
Thu May 5 10:49:33 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* random.c (fill_random_bytes_syscall): use arc4random_buf if

14
eval.c
View file

@ -477,7 +477,7 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
if (NIL_P(mesg)) {
mesg = th->errinfo;
if (INTERNAL_EXCEPTION_P(mesg)) JUMP_TAG(TAG_FATAL);
if (INTERNAL_EXCEPTION_P(mesg)) TH_JUMP_TAG(th, TAG_FATAL);
nocause = 1;
}
if (NIL_P(mesg)) {
@ -551,14 +551,14 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
}
else if (status) {
rb_threadptr_reset_raised(th);
JUMP_TAG(status);
TH_JUMP_TAG(th, status);
}
}
if (rb_threadptr_set_raised(th)) {
th->errinfo = exception_error;
rb_threadptr_reset_raised(th);
JUMP_TAG(TAG_FATAL);
TH_JUMP_TAG(th, TAG_FATAL);
}
if (tag != TAG_FATAL) {
@ -573,7 +573,7 @@ rb_longjmp(int tag, volatile VALUE mesg, VALUE cause)
rb_thread_t *th = GET_THREAD();
setup_exception(th, tag, mesg, cause);
rb_thread_raised_clear(th);
JUMP_TAG(tag);
TH_JUMP_TAG(th, tag);
}
static VALUE make_exception(int argc, const VALUE *argv, int isstr);
@ -743,7 +743,7 @@ rb_raise_jump(VALUE mesg, VALUE cause)
setup_exception(th, TAG_RAISE, mesg, cause);
rb_thread_raised_clear(th);
JUMP_TAG(TAG_RAISE);
TH_JUMP_TAG(th, TAG_RAISE);
}
void
@ -837,7 +837,7 @@ rb_rescue2(VALUE (* b_proc) (ANYARGS), VALUE data1,
}
TH_POP_TAG();
if (state)
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
return result;
}
@ -905,7 +905,7 @@ rb_ensure(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*e_proc)(ANYARGS), VALUE
(*ensure_list.entry.e_proc)(ensure_list.entry.data2);
th->errinfo = errinfo;
if (state)
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
return result;
}

2
gc.c
View file

@ -7572,7 +7572,7 @@ rb_memerror(void)
if (rb_thread_raised_p(th, RAISED_NOMEMORY)) {
rb_thread_raised_clear(th);
GET_THREAD()->errinfo = nomem_error;
JUMP_TAG(TAG_RAISE);
TH_JUMP_TAG(th, TAG_RAISE);
}
rb_thread_raised_set(th, RAISED_NOMEMORY);
rb_exc_raise(nomem_error);

2
load.c
View file

@ -646,7 +646,7 @@ rb_load_internal(VALUE fname, int wrap)
int state = rb_load_internal0(curr_th, fname, wrap);
if (state) {
if (state == TAG_RAISE) rb_exc_raise(curr_th->errinfo);
JUMP_TAG(state);
TH_JUMP_TAG(curr_th, state);
}
}

2
proc.c
View file

@ -1985,7 +1985,7 @@ call_method_data_safe(rb_thread_t *th, const struct METHOD *data,
TH_POP_TAG();
rb_set_safe_level_force(safe);
if (state)
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
return result;
}

View file

@ -980,7 +980,7 @@ signal_exec(VALUE cmd, int safe, int sig)
if (state) {
/* XXX: should be replaced with rb_threadptr_pending_interrupt_enque() */
JUMP_TAG(state);
TH_JUMP_TAG(cur_th, state);
}
}

View file

@ -1422,7 +1422,7 @@ rb_thread_io_blocking_region(rb_blocking_function_t *func, void *data1, int fd)
th->waiting_fd = -1;
if (state) {
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
}
/* TODO: check func() */
RUBY_VM_CHECK_INTS_BLOCKING(th);
@ -1853,7 +1853,7 @@ rb_thread_s_handle_interrupt(VALUE self, VALUE mask_arg)
RUBY_VM_CHECK_INTS(th);
if (state) {
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
}
return r;

4
vm.c
View file

@ -1047,7 +1047,7 @@ vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, VALUE self,
th->safe_level = stored_safe;
if (state) {
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
}
return val;
}
@ -1859,7 +1859,7 @@ vm_exec(rb_thread_t *th)
vm_pop_frame(th);
th->errinfo = (VALUE)err;
TH_TMPPOP_TAG();
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
}
else {
th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);

View file

@ -1191,7 +1191,7 @@ rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data)
/* invalidate bindings? */
if (state) {
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
}
return result;

View file

@ -1397,7 +1397,7 @@ eval_string_with_cref(VALUE self, VALUE src, VALUE scope, rb_cref_t *const cref_
if (state == TAG_RAISE) {
adjust_backtrace_in_eval(th, th->errinfo);
}
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
}
return result;
}
@ -1543,7 +1543,7 @@ rb_eval_string_wrap(const char *str, int *state)
*state = status;
}
else if (status) {
JUMP_TAG(status);
TH_JUMP_TAG(th, status);
}
return val;
}
@ -1554,35 +1554,36 @@ rb_eval_cmd(VALUE cmd, VALUE arg, int level)
int state;
volatile VALUE val = Qnil; /* OK */
volatile int safe = rb_safe_level();
rb_thread_t *th = GET_THREAD();
if (OBJ_TAINTED(cmd)) {
level = RUBY_SAFE_LEVEL_MAX;
}
if (!RB_TYPE_P(cmd, T_STRING)) {
PUSH_TAG();
TH_PUSH_TAG(th);
rb_set_safe_level_force(level);
if ((state = EXEC_TAG()) == 0) {
if ((state = TH_EXEC_TAG()) == 0) {
val = rb_funcall2(cmd, idCall, RARRAY_LENINT(arg),
RARRAY_CONST_PTR(arg));
}
POP_TAG();
TH_POP_TAG();
rb_set_safe_level_force(safe);
if (state)
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
return val;
}
PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
TH_PUSH_TAG(th);
if ((state = TH_EXEC_TAG()) == 0) {
val = eval_string(rb_vm_top_self(), cmd, Qnil, 0, 0);
}
POP_TAG();
TH_POP_TAG();
rb_set_safe_level_force(safe);
if (state) JUMP_TAG(state);
if (state) TH_JUMP_TAG(th, state);
return val;
}
@ -1910,7 +1911,7 @@ rb_throw_obj(VALUE tag, VALUE value)
}
th->errinfo = (VALUE)THROW_DATA_NEW(tag, NULL, TAG_THROW);
JUMP_TAG(TAG_THROW);
TH_JUMP_TAG(th, TAG_THROW);
}
void
@ -1997,24 +1998,32 @@ rb_catch(const char *tag, VALUE (*func)(), VALUE data)
return rb_catch_obj(vtag, func, data);
}
static VALUE vm_catch_protect(VALUE, rb_block_call_func *, VALUE, int *, rb_thread_t *);
VALUE
rb_catch_obj(VALUE t, VALUE (*func)(), VALUE data)
{
int state;
VALUE val = rb_catch_protect(t, (rb_block_call_func *)func, data, &state);
rb_thread_t *th = GET_THREAD();
VALUE val = vm_catch_protect(t, (rb_block_call_func *)func, data, &state, th);
if (state)
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
return val;
}
VALUE
rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, int *stateptr)
{
return vm_catch_protect(t, func, data, stateptr, GET_THREAD());
}
static VALUE
vm_catch_protect(VALUE tag, rb_block_call_func *func, VALUE data,
int *stateptr, rb_thread_t *th)
{
int state;
volatile VALUE val = Qnil; /* OK */
rb_thread_t *th = GET_THREAD();
VALUE val = Qnil; /* OK */
rb_control_frame_t *saved_cfp = th->cfp;
volatile VALUE tag = t;
TH_PUSH_TAG(th);

View file

@ -416,7 +416,7 @@ rb_suppress_tracing(VALUE (*func)(VALUE), VALUE arg)
if (!tracing) th->vm->trace_running--;
if (state) {
JUMP_TAG(state);
TH_JUMP_TAG(th, state);
}
th->state = outer_state;