From 5659d418d91d9757e0c2dc4b95b1f850575cfb5e Mon Sep 17 00:00:00 2001 From: ko1 Date: Fri, 23 Jun 2017 09:43:52 +0000 Subject: move "state" to rb_vm_tag. * vm_core.h (rb_thread_t::tag_state): move to "rb_vm_tag::state". Lifetime of "state" should be same as current tag. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59159 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- cont.c | 2 -- eval_intern.h | 9 +++++---- vm.c | 10 +++++----- vm_core.h | 6 ++---- vm_eval.c | 2 +- vm_insnhelper.c | 10 +++++----- vm_trace.c | 7 ------- 7 files changed, 18 insertions(+), 28 deletions(-) diff --git a/cont.c b/cont.c index 20e87c397b..e5cffce9e0 100644 --- a/cont.c +++ b/cont.c @@ -413,7 +413,6 @@ cont_save_thread(rb_context_t *cont, rb_thread_t *th) sth->local_storage = th->local_storage; sth->safe_level = th->safe_level; sth->raised_flag = th->raised_flag; - sth->tag_state = th->tag_state; sth->status = th->status; sth->tag = th->tag; sth->protect_tag = th->protect_tag; @@ -561,7 +560,6 @@ cont_restore_thread(rb_context_t *cont) th->ec.cfp = sth->ec.cfp; th->safe_level = sth->safe_level; th->raised_flag = sth->raised_flag; - th->tag_state = sth->tag_state; th->status = sth->status; th->tag = sth->tag; th->protect_tag = sth->protect_tag; diff --git a/eval_intern.h b/eval_intern.h index a9b259a52c..7a5dfa185c 100644 --- a/eval_intern.h +++ b/eval_intern.h @@ -131,6 +131,7 @@ LONG WINAPI rb_w32_stack_overflow_handler(struct _EXCEPTION_POINTERS *); #define TH_PUSH_TAG(th) do { \ rb_thread_t * const _th = (th); \ struct rb_vm_tag _tag; \ + _tag.state = TAG_NONE; \ _tag.tag = Qundef; \ _tag.prev = _th->tag; @@ -156,12 +157,12 @@ LONG WINAPI rb_w32_stack_overflow_handler(struct _EXCEPTION_POINTERS *); # define VAR_NOCLOBBERED(var) var #endif -/* clear th->tag_state, and return the value */ +/* clear th->tag->state, and return the value */ static inline int rb_threadptr_tag_state(rb_thread_t *th) { - enum ruby_tag_type state = th->tag_state; - th->tag_state = TAG_NONE; + enum ruby_tag_type state = th->tag->state; + th->tag->state = TAG_NONE; return state; } @@ -169,7 +170,7 @@ NORETURN(static inline void rb_threadptr_tag_jump(rb_thread_t *, enum ruby_tag_t static inline void rb_threadptr_tag_jump(rb_thread_t *th, enum ruby_tag_type st) { - th->tag_state = st; + th->tag->state = st; ruby_longjmp(th->tag->buf, 1); } diff --git a/vm.c b/vm.c index 1b2088475a..4979f9ce97 100644 --- a/vm.c +++ b/vm.c @@ -1476,7 +1476,6 @@ vm_iter_break(rb_thread_t *th, VALUE val) } #endif - th->tag_state = TAG_BREAK; th->errinfo = (VALUE)THROW_DATA_NEW(val, target_cfp, TAG_BREAK); TH_JUMP_TAG(th, TAG_BREAK); } @@ -1787,9 +1786,10 @@ vm_exec(rb_thread_t *th) if ((state = EXEC_TAG()) == TAG_NONE) { vm_loop_start: result = vm_exec_core(th, initial); - if ((state = th->tag_state) != TAG_NONE) { + VM_ASSERT(th->tag == &_tag); + if ((state = _tag.state) != TAG_NONE) { err = (struct vm_throw_data *)result; - th->tag_state = TAG_NONE; + _tag.state = TAG_NONE; goto exception_handler; } } @@ -1939,7 +1939,7 @@ vm_exec(rb_thread_t *th) #endif } th->errinfo = Qnil; - th->tag_state = TAG_NONE; + VM_ASSERT(th->tag->state == TAG_NONE); goto vm_loop_start; } } @@ -1989,7 +1989,7 @@ vm_exec(rb_thread_t *th) catch_iseq->body->stack_max); state = 0; - th->tag_state = TAG_NONE; + th->tag->state = TAG_NONE; th->errinfo = Qnil; goto vm_loop_start; } diff --git a/vm_core.h b/vm_core.h index 6c1b9665c9..9081bcea3d 100644 --- a/vm_core.h +++ b/vm_core.h @@ -691,8 +691,9 @@ typedef RUBY_JMP_BUF rb_jmpbuf_t; struct rb_vm_tag { VALUE tag; VALUE retval; - rb_jmpbuf_t buf; struct rb_vm_tag *prev; + enum ruby_tag_type state; + rb_jmpbuf_t buf; }; struct rb_vm_protect_tag { @@ -743,9 +744,6 @@ typedef struct rb_thread_struct { int raised_flag; VALUE last_status; /* $? */ - /* passing state */ - enum ruby_tag_type tag_state; - /* for rb_iterate */ VALUE passed_block_handler; diff --git a/vm_eval.c b/vm_eval.c index ef34d124d7..3a595c0f2a 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1136,7 +1136,7 @@ rb_iterate0(VALUE (* it_proc) (VALUE), VALUE data1, rb_vm_rewind_cfp(th, cfp); state = 0; - th->tag_state = TAG_NONE; + th->tag->state = TAG_NONE; th->errinfo = Qnil; if (state == TAG_RETRY) goto iter_retry; diff --git a/vm_insnhelper.c b/vm_insnhelper.c index b0e565c83e..2370545acb 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1029,16 +1029,16 @@ vm_throw_continue(rb_thread_t *th, VALUE err) /* continue throw */ if (FIXNUM_P(err)) { - th->tag_state = FIX2INT(err); + th->tag->state = FIX2INT(err); } else if (SYMBOL_P(err)) { - th->tag_state = TAG_THROW; + th->tag->state = TAG_THROW; } else if (THROW_DATA_P(err)) { - th->tag_state = THROW_DATA_STATE((struct vm_throw_data *)err); + th->tag->state = THROW_DATA_STATE((struct vm_throw_data *)err); } else { - th->tag_state = TAG_RAISE; + th->tag->state = TAG_RAISE; } return err; } @@ -1177,7 +1177,7 @@ vm_throw_start(rb_thread_t *const th, rb_control_frame_t *const reg_cfp, enum ru rb_bug("isns(throw): unsupport throw type"); } - th->tag_state = state; + th->tag->state = state; return (VALUE)THROW_DATA_NEW(throwobj, escape_cfp, state); } diff --git a/vm_trace.c b/vm_trace.c index d9997ec9cd..75c4693bc3 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -329,12 +329,10 @@ rb_threadptr_exec_event_hooks_orig(rb_trace_arg_t *trace_arg, int pop_p) if (th->trace_arg == 0 && /* check reentrant */ trace_arg->self != rb_mRubyVMFrozenCore /* skip special methods. TODO: remove it. */) { const VALUE errinfo = th->errinfo; - const enum ruby_tag_type outer_state = th->tag_state; const VALUE old_recursive = th->local_storage_recursive_hash; int state = 0; th->local_storage_recursive_hash = th->local_storage_recursive_hash_for_trace; - th->tag_state = TAG_NONE; th->errinfo = Qnil; th->vm->trace_running++; @@ -366,7 +364,6 @@ rb_threadptr_exec_event_hooks_orig(rb_trace_arg_t *trace_arg, int pop_p) } TH_JUMP_TAG(th, state); } - th->tag_state = outer_state; } } } @@ -387,7 +384,6 @@ VALUE rb_suppress_tracing(VALUE (*func)(VALUE), VALUE arg) { volatile int raised; - volatile enum ruby_tag_type outer_state; VALUE result = Qnil; rb_thread_t *volatile th = GET_THREAD(); enum ruby_tag_type state; @@ -399,8 +395,6 @@ rb_suppress_tracing(VALUE (*func)(VALUE), VALUE arg) if (!th->trace_arg) th->trace_arg = &dummy_trace_arg; raised = rb_threadptr_reset_raised(th); - outer_state = th->tag_state; - th->tag_state = TAG_NONE; TH_PUSH_TAG(th); if ((state = TH_EXEC_TAG()) == TAG_NONE) { @@ -419,7 +413,6 @@ rb_suppress_tracing(VALUE (*func)(VALUE), VALUE arg) TH_JUMP_TAG(th, state); } - th->tag_state = outer_state; return result; } -- cgit v1.2.3