aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cont.c2
-rw-r--r--test/ruby/test_fiber.rb8
-rw-r--r--thread.c16
-rw-r--r--vm_core.h2
4 files changed, 25 insertions, 3 deletions
diff --git a/cont.c b/cont.c
index 50fa45e96e..7787530c94 100644
--- a/cont.c
+++ b/cont.c
@@ -1275,7 +1275,7 @@ rb_fiber_start(void)
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;
diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb
index d1d15828fc..ffcb02ce51 100644
--- a/test/ruby/test_fiber.rb
+++ b/test/ruby/test_fiber.rb
@@ -344,5 +344,13 @@ class TestFiber < Test::Unit::TestCase
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
diff --git a/thread.c b/thread.c
index fffce53675..705b456ccb 100644
--- a/thread.c
+++ b/thread.c
@@ -550,16 +550,28 @@ ruby_thread_init_stack(rb_thread_t *th)
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) {
- const VALUE *ep = vm_proc_ep(th->first_proc);
rb_proc_t *proc;
GetProcPtr(th->first_proc, proc);
th->errinfo = Qnil;
- th->root_lep = ep ? rb_vm_ep_local_ep(ep) : NULL;
+ 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,
diff --git a/vm_core.h b/vm_core.h
index c226680610..5b930a8aa7 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -1166,6 +1166,8 @@ VM_STACK_ENV_WRITE(const VALUE *ep, int index, VALUE v)
}
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)