diff options
| author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-21 05:59:20 +0000 |
|---|---|---|
| committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-21 05:59:20 +0000 |
| commit | 65388f24bfdd5dafbbca401e59d6ced7a2b04296 (patch) | |
| tree | 7ebb2dc5155c72e0c088dbef19c8c5540e7ed615 | |
| parent | ecbf9fc2998dbc6801712dde9ab0747837a016fc (diff) | |
| download | ruby-65388f24bfdd5dafbbca401e59d6ced7a2b04296.tar.gz ruby-65388f24bfdd5dafbbca401e59d6ced7a2b04296.tar.xz ruby-65388f24bfdd5dafbbca401e59d6ced7a2b04296.zip | |
* enumerator.c (enumerator_init_copy): prohibit cloning of
generators since Fibers cannot be copied.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@14404 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
| -rw-r--r-- | ChangeLog | 5 | ||||
| -rw-r--r-- | enumerator.c | 12 |
2 files changed, 14 insertions, 3 deletions
@@ -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 366c64c28..729d7c04c 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; } |
