Skip to content

Commit

Permalink
merges r23616 from trunk into ruby_1_9_1.
Browse files Browse the repository at this point in the history
--
* 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
  • Loading branch information
yugui committed Jun 20, 2009
1 parent 33b5635 commit 41353c5
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 3 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
14 changes: 12 additions & 2 deletions cont.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand All @@ -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) {
Expand All @@ -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");
}

Expand Down
5 changes: 5 additions & 0 deletions test/ruby/test_fiber.rb
Original file line number Diff line number Diff line change
Expand Up @@ -164,5 +164,10 @@ def tvar(var, val)
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

2 changes: 1 addition & 1 deletion version.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit 41353c5

Please sign in to comment.