ruby-changes:12095
From: yugui <ko1@a...>
Date: Sat, 20 Jun 2009 18:08:53 +0900 (JST)
Subject: [ruby-changes:12095] Ruby:r23766 (ruby_1_9_1): merges r23616 from trunk into ruby_1_9_1.
yugui 2009-06-20 18:08:10 +0900 (Sat, 20 Jun 2009) New Revision: 23766 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23766 Log: 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] Modified files: branches/ruby_1_9_1/ChangeLog branches/ruby_1_9_1/cont.c branches/ruby_1_9_1/test/ruby/test_fiber.rb branches/ruby_1_9_1/version.h Index: ruby_1_9_1/ChangeLog =================================================================== --- ruby_1_9_1/ChangeLog (revision 23765) +++ ruby_1_9_1/ChangeLog (revision 23766) @@ -1,3 +1,10 @@ +Mon Jun 1 11:21:29 2009 Nobuyoshi Nakada <nobu@r...> + + * 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] + Mon Jun 1 07:20:02 2009 Yukihiro Matsumoto <matz@r...> * ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): returns Inf if Index: ruby_1_9_1/cont.c =================================================================== --- ruby_1_9_1/cont.c (revision 23765) +++ ruby_1_9_1/cont.c (revision 23766) @@ -279,6 +279,7 @@ VALUE value; value = cont->value; + if (cont->argc == -1) rb_exc_raise(value); cont->value = Qnil; *stat = 1; return value; @@ -832,6 +833,7 @@ 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 @@ 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 @@ 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"); } Index: ruby_1_9_1/version.h =================================================================== --- ruby_1_9_1/version.h (revision 23765) +++ ruby_1_9_1/version.h (revision 23766) @@ -1,6 +1,6 @@ #define RUBY_VERSION "1.9.1" #define RUBY_RELEASE_DATE "2009-05-22" -#define RUBY_PATCHLEVEL 164 +#define RUBY_PATCHLEVEL 165 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 1 Index: ruby_1_9_1/test/ruby/test_fiber.rb =================================================================== --- ruby_1_9_1/test/ruby/test_fiber.rb (revision 23765) +++ ruby_1_9_1/test/ruby/test_fiber.rb (revision 23766) @@ -164,5 +164,10 @@ assert_equal(nil, Thread.current[:v]); fb.resume assert_equal(nil, Thread.current[:v]); end + + def test_resume_self + f = Fiber.new {f.resume} + assert_raise(FiberError, '[ruby-core:23651]') {f.transfer} + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/