From 41353c51a093bdd2f804b7165cf42ea6bfd89fe4 Mon Sep 17 00:00:00 2001 From: yugui Date: Sat, 20 Jun 2009 09:08:10 +0000 Subject: merges r23616 from trunk into ruby_1_9_1. -- * cont.c (cont_capture, fiber_store): reraise transferred error. * cont.c (fiber_switch): transfers dead fiber error to the previouse or root fiber if the current fiber is dead. [ruby-core:23651] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@23766 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- cont.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'cont.c') diff --git a/cont.c b/cont.c index 4ae5e93165..24db1d8058 100644 --- a/cont.c +++ b/cont.c @@ -279,6 +279,7 @@ cont_capture(volatile int *stat) VALUE value; value = cont->value; + if (cont->argc == -1) rb_exc_raise(value); cont->value = Qnil; *stat = 1; return value; @@ -832,6 +833,7 @@ fiber_store(rb_fiber_t *next_fib) if (ruby_setjmp(fib->cont.jmpbuf)) { /* restored */ GetFiberPtr(th->fiber, fib); + if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value); return fib->cont.value; } else { @@ -857,7 +859,15 @@ fiber_switch(VALUE fibval, int argc, VALUE *argv, int is_resume) rb_raise(rb_eFiberError, "fiber called across trap"); } else if (fib->status == TERMINATED) { - rb_raise(rb_eFiberError, "dead fiber called"); + value = rb_exc_new2(rb_eFiberError, "dead fiber called"); + if (th->fiber != fibval) rb_exc_raise(value); + fibval = fib->prev; + if (NIL_P(fibval)) fibval = th->root_fiber; + GetFiberPtr(fibval, fib); + cont = &fib->cont; + cont->argc = -1; + cont->value = value; + cont_restore_0(cont, &value); } if (is_resume) { @@ -868,7 +878,7 @@ fiber_switch(VALUE fibval, int argc, VALUE *argv, int is_resume) cont->value = make_passing_arg(argc, argv); if ((value = fiber_store(fib)) == Qundef) { - cont_restore_0(&fib->cont, &value); + cont_restore_0(cont, &value); rb_bug("rb_fiber_resume: unreachable"); } -- cgit v1.2.3