summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-20 09:08:10 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-20 09:08:10 +0000
commit41353c51a093bdd2f804b7165cf42ea6bfd89fe4 (patch)
treec550ddfb3342550ce25d105f12b6a4d646cc7022
parent33b5635a51196a5767b56d5a32556b96a31dc5b5 (diff)
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
-rw-r--r--ChangeLog7
-rw-r--r--cont.c14
-rw-r--r--test/ruby/test_fiber.rb5
-rw-r--r--version.h2
4 files changed, 25 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index cc4fa3a03c..93bca74a23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Jun 1 11:21:29 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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@ruby-lang.org>
* ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): returns Inf if
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");
}
diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb
index bf56b2b6d2..e239390681 100644
--- a/test/ruby/test_fiber.rb
+++ b/test/ruby/test_fiber.rb
@@ -164,5 +164,10 @@ class TestFiber < Test::Unit::TestCase
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
diff --git a/version.h b/version.h
index e24d04031e..13abbd9b9d 100644
--- a/version.h
+++ b/version.h
@@ -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