aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--cont.c6
-rw-r--r--test/ruby/test_fiber.rb30
3 files changed, 17 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 91b6f59bcb..9f4e19d38b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/cont.c b/cont.c
index 6e37f84707..3450593867 100644
--- a/cont.c
+++ b/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;
}
diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb
index 6c67a5815d..d6212cc7ea 100644
--- a/test/ruby/test_fiber.rb
+++ b/test/ruby/test_fiber.rb
@@ -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