* 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:
parent
f84c8cb190
commit
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>
|
Fri Jun 15 12:14:07 2007 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* sample/test.rb: fix to show line information whether test succeeds.
|
* 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;
|
rb_context_t *fcont;
|
||||||
GetContPtr(cont->saved_thread.fiber, 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) {
|
if (!fcont->alive) {
|
||||||
rb_raise(rb_eRuntimeError, "continuation called dead fiber");
|
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);
|
cont_restore_0(cont, (VALUE *)&cont);
|
||||||
rb_bug("rb_fiber_yield: unreachable");
|
rb_bug("rb_fiber_yield: unreachable");
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +70,12 @@ class TestFiber < Test::Unit::TestCase
|
|||||||
f.yield
|
f.yield
|
||||||
f.yield
|
f.yield
|
||||||
}
|
}
|
||||||
|
assert_raise(RuntimeError){
|
||||||
|
f = Fiber.new{
|
||||||
|
@c = callcc{|c| @c = c}
|
||||||
|
}.yield
|
||||||
|
@c.call # cross fiber callcc
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_loop
|
def test_loop
|
||||||
@ -102,29 +108,5 @@ class TestFiber < Test::Unit::TestCase
|
|||||||
end.yield
|
end.yield
|
||||||
}
|
}
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user