зеркало из https://github.com/github/ruby.git
* 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:
Родитель
f84c8cb190
Коммит
31ac946975
|
@ -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
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
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче