[前][次][番号順一覧][スレッド一覧]

ruby-changes:47044

From: ko1 <ko1@a...>
Date: Fri, 23 Jun 2017 18:43:58 +0900 (JST)
Subject: [ruby-changes:47044] ko1:r59159 (trunk): move "state" to rb_vm_tag.

ko1	2017-06-23 18:43:52 +0900 (Fri, 23 Jun 2017)

  New Revision: 59159

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59159

  Log:
    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.

  Modified files:
    trunk/cont.c
    trunk/eval_intern.h
    trunk/vm.c
    trunk/vm_core.h
    trunk/vm_eval.c
    trunk/vm_insnhelper.c
    trunk/vm_trace.c
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 59158)
+++ vm_core.h	(revision 59159)
@@ -691,8 +691,9 @@ typedef RUBY_JMP_BUF rb_jmpbuf_t; https://github.com/ruby/ruby/blob/trunk/vm_core.h#L691
 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 { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L744
     int raised_flag;
     VALUE last_status; /* $? */
 
-    /* passing state */
-    enum ruby_tag_type tag_state;
-
     /* for rb_iterate */
     VALUE passed_block_handler;
 
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 59158)
+++ vm_insnhelper.c	(revision 59159)
@@ -1029,16 +1029,16 @@ vm_throw_continue(rb_thread_t *th, VALUE https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1029
     /* 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 https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1177
 	rb_bug("isns(throw): unsupport throw type");
     }
 
-    th->tag_state = state;
+    th->tag->state = state;
     return (VALUE)THROW_DATA_NEW(throwobj, escape_cfp, state);
 }
 
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 59158)
+++ vm_eval.c	(revision 59159)
@@ -1136,7 +1136,7 @@ rb_iterate0(VALUE (* it_proc) (VALUE), V https://github.com/ruby/ruby/blob/trunk/vm_eval.c#L1136
 	    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;
Index: vm_trace.c
===================================================================
--- vm_trace.c	(revision 59158)
+++ vm_trace.c	(revision 59159)
@@ -329,12 +329,10 @@ rb_threadptr_exec_event_hooks_orig(rb_tr https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L329
 	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_tr https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L364
 		}
 		TH_JUMP_TAG(th, state);
 	    }
-	    th->tag_state = outer_state;
 	}
     }
 }
@@ -387,7 +384,6 @@ VALUE https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L384
 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) https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L395
     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) https://github.com/ruby/ruby/blob/trunk/vm_trace.c#L413
 	TH_JUMP_TAG(th, state);
     }
 
-    th->tag_state = outer_state;
     return result;
 }
 
Index: cont.c
===================================================================
--- cont.c	(revision 59158)
+++ cont.c	(revision 59159)
@@ -413,7 +413,6 @@ cont_save_thread(rb_context_t *cont, rb_ https://github.com/ruby/ruby/blob/trunk/cont.c#L413
     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) https://github.com/ruby/ruby/blob/trunk/cont.c#L560
     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;
Index: vm.c
===================================================================
--- vm.c	(revision 59158)
+++ vm.c	(revision 59159)
@@ -1476,7 +1476,6 @@ vm_iter_break(rb_thread_t *th, VALUE val https://github.com/ruby/ruby/blob/trunk/vm.c#L1476
     }
 #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) https://github.com/ruby/ruby/blob/trunk/vm.c#L1786
     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) https://github.com/ruby/ruby/blob/trunk/vm.c#L1939
 #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) https://github.com/ruby/ruby/blob/trunk/vm.c#L1989
 			  catch_iseq->body->stack_max);
 
 	    state = 0;
-	    th->tag_state = TAG_NONE;
+	    th->tag->state = TAG_NONE;
 	    th->errinfo = Qnil;
 	    goto vm_loop_start;
 	}
Index: eval_intern.h
===================================================================
--- eval_intern.h	(revision 59158)
+++ eval_intern.h	(revision 59159)
@@ -131,6 +131,7 @@ LONG WINAPI rb_w32_stack_overflow_handle https://github.com/ruby/ruby/blob/trunk/eval_intern.h#L131
 #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_handle https://github.com/ruby/ruby/blob/trunk/eval_intern.h#L157
 # 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 https://github.com/ruby/ruby/blob/trunk/eval_intern.h#L170
 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);
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]