* cont.c (rb_cont_call): forbid cross fiber continuation call.

* test/ruby/test_fiber.rb: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2007-06-15 03:20:13 +00:00
Родитель f84c8cb190
Коммит 31ac946975
3 изменённых файлов: 17 добавлений и 25 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Fri Jun 15 12:20:11 2007 Koichi Sasada <ko1@atdot.net>
* cont.c (rb_cont_call): forbid cross fiber continuation call.
* test/ruby/test_fiber.rb: ditto.
Fri Jun 15 12:14:07 2007 Koichi Sasada <ko1@atdot.net>
* sample/test.rb: fix to show line information whether test succeeds.

6
cont.c
Просмотреть файл

@ -439,6 +439,10 @@ rb_cont_call(int argc, VALUE *argv, VALUE contval)
rb_context_t *fcont;
GetContPtr(cont->saved_thread.fiber, fcont);
if (th->fiber != cont->saved_thread.fiber) {
rb_raise(rb_eRuntimeError, "continuation called across fiber");
}
if (!fcont->alive) {
rb_raise(rb_eRuntimeError, "continuation called dead fiber");
}
@ -610,7 +614,7 @@ rb_fiber_yield(int argc, VALUE *argv, VALUE fval)
cont_restore_0(cont, (VALUE *)&cont);
rb_bug("rb_fiber_yield: unreachable");
}
return value;
}

Просмотреть файл

@ -70,6 +70,12 @@ class TestFiber < Test::Unit::TestCase
f.yield
f.yield
}
assert_raise(RuntimeError){
f = Fiber.new{
@c = callcc{|c| @c = c}
}.yield
@c.call # cross fiber callcc
}
end
def test_loop
@ -102,29 +108,5 @@ class TestFiber < Test::Unit::TestCase
end.yield
}
end
def test_with_callcc
c = nil
f1 = f2 = nil
f1 = Fiber.new do
callcc do |c2|
c = c2
f2.yield
end
:ok
end
f2 = Fiber.new do
c.call
end
assert_equal(:ok, f1.yield)
assert_equal(:ok,
callcc {|c|
Fiber.new {
c.call :ok
}.yield
}
)
end
end