From e524d4577f782100acea74a73e15eef5bea95553 Mon Sep 17 00:00:00 2001 From: knu Date: Sun, 20 Apr 2008 12:10:04 +0000 Subject: Tag for 1.8.7-preview2. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_7_preview2@16110 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ enumerator.c | 23 ++++++++++++++--------- version.h | 6 +++--- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index f8c6ff5820..c254414d2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sun Apr 20 21:02:06 2008 Akinori MUSHA + + * enumerator.c: Resolve the method every time an enumeration + method is run, not once when the enumerator is initialized as it + was before, so that method_missing() and method (re)definition + afterwards are both in effect; pointed out in: [ruby-core:16441] + Sun Apr 20 17:59:25 2008 Akinori MUSHA * object.c, NEWS, test/ruby/test_symbol.rb: Revert Symbol#to_proc diff --git a/enumerator.c b/enumerator.c index c27ab1688b..6702bca1cd 100644 --- a/enumerator.c +++ b/enumerator.c @@ -21,7 +21,7 @@ * object. */ VALUE rb_cEnumerator; -static VALUE sym_each, sym_call; +static VALUE sym_each; VALUE rb_eStopIteration; @@ -37,7 +37,8 @@ proc_call(proc, args) } struct enumerator { - VALUE method; + VALUE obj; + VALUE meth; VALUE proc; VALUE args; rb_block_call_func *iter; @@ -49,7 +50,8 @@ enumerator_mark(p) void *p; { struct enumerator *ptr = p; - rb_gc_mark(ptr->method); + rb_gc_mark(ptr->obj); + rb_gc_mark(ptr->meth); rb_gc_mark(ptr->proc); rb_gc_mark(ptr->args); } @@ -255,7 +257,8 @@ enumerator_init(enum_obj, obj, meth, argc, argv) { struct enumerator *ptr = enumerator_ptr(enum_obj); - ptr->method = rb_obj_method(obj, meth); + ptr->obj = obj; + ptr->meth = meth; if (rb_block_given_p()) { ptr->proc = rb_block_proc(); ptr->iter = enumerator_iter_i; @@ -312,7 +315,8 @@ enumerator_init_copy(obj, orig) ptr0 = enumerator_ptr(orig); ptr1 = enumerator_ptr(obj); - ptr1->method = ptr0->method; + ptr1->obj = ptr0->obj; + ptr1->meth = ptr0->meth; ptr1->proc = ptr0->proc; ptr1->iter = ptr0->iter; ptr1->args = ptr0->args; @@ -345,6 +349,7 @@ enumerator_each(obj) struct enumerator *e; int argc = 0; VALUE *argv = 0; + VALUE method; if (!rb_block_given_p()) return obj; e = enumerator_ptr(obj); @@ -352,7 +357,7 @@ enumerator_each(obj) argc = RARRAY_LEN(e->args); argv = RARRAY_PTR(e->args); } - return rb_block_call(e->method, SYM2ID(sym_call), argc, argv, e->iter, (VALUE)e); + return rb_block_call(e->obj, rb_to_id(e->meth), argc, argv, e->iter, (VALUE)e); } static VALUE @@ -381,13 +386,14 @@ enumerator_with_index(obj) VALUE memo = 0; int argc = 0; VALUE *argv = 0; + VALUE method; RETURN_ENUMERATOR(obj, 0, 0); if (e->args) { argc = RARRAY_LEN(e->args); argv = RARRAY_PTR(e->args); } - return rb_block_call(e->method, SYM2ID(sym_call), argc, argv, + return rb_block_call(e->obj, rb_to_id(e->meth), argc, argv, enumerator_with_index_i, (VALUE)&memo); } @@ -454,8 +460,7 @@ Init_Enumerator() rb_eStopIteration = rb_define_class("StopIteration", rb_eIndexError); - sym_each = ID2SYM(rb_intern("each")); - sym_call = ID2SYM(rb_intern("call")); + sym_each = ID2SYM(rb_intern("each")); rb_provide("enumerator.so"); /* for backward compatibility */ } diff --git a/version.h b/version.h index 5fcce79bab..42557ac59f 100644 --- a/version.h +++ b/version.h @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.8.7" -#define RUBY_RELEASE_DATE "2008-04-19" +#define RUBY_RELEASE_DATE "2008-04-20" #define RUBY_VERSION_CODE 187 -#define RUBY_RELEASE_CODE 20080419 +#define RUBY_RELEASE_CODE 20080420 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 7 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 4 -#define RUBY_RELEASE_DAY 19 +#define RUBY_RELEASE_DAY 20 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; -- cgit v1.2.3