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

ruby-changes:45930

From: naruse <ko1@a...>
Date: Fri, 17 Mar 2017 16:06:57 +0900 (JST)
Subject: [ruby-changes:45930] naruse:r58003 (ruby_2_4): merge revision(s) 57968, 57969, 57970: [Backport #13313]

naruse	2017-03-17 16:06:50 +0900 (Fri, 17 Mar 2017)

  New Revision: 58003

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

  Log:
    merge revision(s) 57968,57969,57970: [Backport #13313]
    
    thread.c: thread_do_start
    
    * thread.c (thread_do_start): extract from a macro in
      thread_start_func_2 for debugger.
    thread.c: Thread.start with Symbol
    
    * thread.c (thread_do_start): fix segfault at start with Symbol.
      proc created by Symbol#to_proc does not have environment unless
      using refinements.  [ruby-core:80147] [Bug #13313]
    Fiber also has same issue. [Bug #13313]
    
    * thread.c (rb_vm_proc_local_ep): added.
    
    * cont.c (rb_fiber_start): use rb_vm_proc_local_ep().

  Modified directories:
    branches/ruby_2_4/
  Modified files:
    branches/ruby_2_4/cont.c
    branches/ruby_2_4/test/ruby/test_fiber.rb
    branches/ruby_2_4/test/ruby/test_thread.rb
    branches/ruby_2_4/thread.c
    branches/ruby_2_4/version.h
    branches/ruby_2_4/vm_core.h
Index: ruby_2_4/version.h
===================================================================
--- ruby_2_4/version.h	(revision 58002)
+++ ruby_2_4/version.h	(revision 58003)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_4/version.h#L1
 #define RUBY_VERSION "2.4.0"
 #define RUBY_RELEASE_DATE "2017-03-17"
-#define RUBY_PATCHLEVEL 104
+#define RUBY_PATCHLEVEL 105
 
 #define RUBY_RELEASE_YEAR 2017
 #define RUBY_RELEASE_MONTH 3
Index: ruby_2_4/test/ruby/test_thread.rb
===================================================================
--- ruby_2_4/test/ruby/test_thread.rb	(revision 58002)
+++ ruby_2_4/test/ruby/test_thread.rb	(revision 58003)
@@ -176,6 +176,14 @@ class TestThread < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_4/test/ruby/test_thread.rb#L176
     t2.kill if t2
   end
 
+  def test_new_symbol_proc
+    bug = '[ruby-core:80147] [Bug #13313]'
+    assert_ruby_status([], "#{<<-"begin;"}\n#{<<-'end;'}", bug)
+    begin;
+      exit("1" == Thread.start(1, &:to_s).value)
+    end;
+  end
+
   def test_join
     t = Thread.new { sleep }
     assert_nil(t.join(0.05))
Index: ruby_2_4/test/ruby/test_fiber.rb
===================================================================
--- ruby_2_4/test/ruby/test_fiber.rb	(revision 58002)
+++ ruby_2_4/test/ruby/test_fiber.rb	(revision 58003)
@@ -344,5 +344,13 @@ class TestFiber < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_4/test/ruby/test_fiber.rb#L344
     assert_equal("inner", s2)
     assert_equal(s1, $_, bug7678)
   end
+
+  def test_new_symbol_proc
+    bug = '[ruby-core:80147] [Bug #13313]'
+    assert_ruby_status([], "#{<<-"begin;"}\n#{<<-'end;'}", bug)
+    begin;
+      exit("1" == Fiber.new(&:to_s).resume(1))
+    end;
+  end
 end
 
Index: ruby_2_4/vm_core.h
===================================================================
--- ruby_2_4/vm_core.h	(revision 58002)
+++ ruby_2_4/vm_core.h	(revision 58003)
@@ -1166,6 +1166,8 @@ VM_STACK_ENV_WRITE(const VALUE *ep, int https://github.com/ruby/ruby/blob/trunk/ruby_2_4/vm_core.h#L1166
 }
 
 const VALUE *rb_vm_ep_local_ep(const VALUE *ep);
+const VALUE *rb_vm_proc_local_ep(VALUE proc);
+
 VALUE rb_vm_frame_block_handler(const rb_control_frame_t *cfp);
 
 #define RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp) ((cfp)+1)
Index: ruby_2_4/thread.c
===================================================================
--- ruby_2_4/thread.c	(revision 58002)
+++ ruby_2_4/thread.c	(revision 58003)
@@ -550,12 +550,45 @@ ruby_thread_init_stack(rb_thread_t *th) https://github.com/ruby/ruby/blob/trunk/ruby_2_4/thread.c#L550
     native_thread_init_stack(th);
 }
 
+const VALUE *
+rb_vm_proc_local_ep(VALUE proc)
+{
+    const VALUE *ep = vm_proc_ep(proc);
+
+    if (ep) {
+	return rb_vm_ep_local_ep(ep);
+    }
+    else {
+	return NULL;
+    }
+}
+
+static void
+thread_do_start(rb_thread_t *th, VALUE args)
+{
+    native_set_thread_name(th);
+    if (!th->first_func) {
+	rb_proc_t *proc;
+	GetProcPtr(th->first_proc, proc);
+	th->errinfo = Qnil;
+	th->root_lep = rb_vm_proc_local_ep(th->first_proc);
+	th->root_svar = Qfalse;
+	EXEC_EVENT_HOOK(th, RUBY_EVENT_THREAD_BEGIN, th->self, 0, 0, 0, Qundef);
+	th->value = rb_vm_invoke_proc(th, proc,
+				      (int)RARRAY_LEN(args), RARRAY_CONST_PTR(args),
+				      VM_BLOCK_HANDLER_NONE);
+	EXEC_EVENT_HOOK(th, RUBY_EVENT_THREAD_END, th->self, 0, 0, 0, Qundef);
+    }
+    else {
+	th->value = (*th->first_func)((void *)args);
+    }
+}
+
 static int
 thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_start)
 {
     int state;
     VALUE args = th->first_args;
-    rb_proc_t *proc;
     rb_thread_list_t *join_list;
     rb_thread_t *main_th;
     VALUE errinfo = Qnil;
@@ -583,23 +616,7 @@ thread_start_func_2(rb_thread_t *th, VAL https://github.com/ruby/ruby/blob/trunk/ruby_2_4/thread.c#L616
 
 	TH_PUSH_TAG(th);
 	if ((state = EXEC_TAG()) == 0) {
-	    SAVE_ROOT_JMPBUF(th, {
-                native_set_thread_name(th);
-		if (!th->first_func) {
-		    GetProcPtr(th->first_proc, proc);
-		    th->errinfo = Qnil;
-		    th->root_lep = rb_vm_ep_local_ep(vm_proc_ep(th->first_proc));
-		    th->root_svar = Qfalse;
-		    EXEC_EVENT_HOOK(th, RUBY_EVENT_THREAD_BEGIN, th->self, 0, 0, 0, Qundef);
-		    th->value = rb_vm_invoke_proc(th, proc,
-						  (int)RARRAY_LEN(args), RARRAY_CONST_PTR(args),
-						  VM_BLOCK_HANDLER_NONE);
-		    EXEC_EVENT_HOOK(th, RUBY_EVENT_THREAD_END, th->self, 0, 0, 0, Qundef);
-		}
-		else {
-		    th->value = (*th->first_func)((void *)args);
-		}
-	    });
+	    SAVE_ROOT_JMPBUF(th, thread_do_start(th, args));
 	}
 	else {
 	    errinfo = th->errinfo;
Index: ruby_2_4/cont.c
===================================================================
--- ruby_2_4/cont.c	(revision 58002)
+++ ruby_2_4/cont.c	(revision 58003)
@@ -1277,7 +1277,7 @@ rb_fiber_start(void) https://github.com/ruby/ruby/blob/trunk/ruby_2_4/cont.c#L1277
 	argv = (argc = cont->argc) > 1 ? RARRAY_CONST_PTR(args) : &args;
 	cont->value = Qnil;
 	th->errinfo = Qnil;
-	th->root_lep = rb_vm_ep_local_ep(vm_block_ep(&proc->block));
+	th->root_lep = rb_vm_proc_local_ep(cont->saved_thread.first_proc);
 	th->root_svar = Qfalse;
 	fib->status = RUNNING;
 

Property changes on: ruby_2_4
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r57968-57970


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

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