summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-21 05:59:20 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-21 05:59:20 +0000
commit8fa21bc05fc892d9c8569f5f3974e993621d9785 (patch)
tree7ebb2dc5155c72e0c088dbef19c8c5540e7ed615
parent0d49e43be2440a7b2828d7568abbda9e321b486a (diff)
* enumerator.c (enumerator_init_copy): prohibit cloning of
generators since Fibers cannot be copied. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14404 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--enumerator.c12
2 files changed, 14 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index b874507208..4c0444fd46 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Dec 21 14:58:27 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * enumerator.c (enumerator_init_copy): prohibit cloning of
+ generators since Fibers cannot be copied.
+
Fri Dec 21 14:46:07 2007 Tanaka Akira <akr@fsij.org>
* io.c (Init_IO): define IO::BINARY even if O_BINARY is not exist.
diff --git a/enumerator.c b/enumerator.c
index 366c64c28a..729d7c04ca 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -285,14 +285,20 @@ enumerator_initialize(int argc, VALUE *argv, VALUE obj)
static VALUE
enumerator_init_copy(VALUE obj, VALUE orig)
{
- struct enumerator *ptr0 = enumerator_ptr(orig);
- struct enumerator *ptr1 = enumerator_ptr(obj);
+ struct enumerator *ptr0, *ptr1;
+
+ ptr0 = enumerator_ptr(orig);
+ if (ptr1->fib) {
+ /* Fibers cannot be copied */
+ rb_raise(rb_eTypeError, "can't copy execution context");
+ }
+ ptr1 = enumerator_ptr(obj);
ptr1->method = ptr0->method;
ptr1->proc = ptr0->proc;
ptr1->iter = ptr0->iter;
ptr1->args = ptr0->args;
- ptr1->fib = ptr0->fib;
+ ptr1->fib = 0;
return obj;
}