ruby-changes:4663
From: ko1@a...
Date: Tue, 22 Apr 2008 22:52:02 +0900 (JST)
Subject: [ruby-changes:4663] knu - Ruby:r16157 (ruby_1_8): * eval.c (rb_proc_new, YIELD_FUNC_LAMBDA): Add a new nd_state
knu 2008-04-22 22:51:44 +0900 (Tue, 22 Apr 2008) New Revision: 16157 Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/eval.c branches/ruby_1_8/intern.h branches/ruby_1_8/object.c Log: * eval.c (rb_proc_new, YIELD_FUNC_LAMBDA): Add a new nd_state YIELD_FUNC_LAMBDA which avoids automatic `avalue' conversion for arguments. This fixes a bug where [1,[2,3]].map(&:object_id) fails. * intern.h, object.c: Hide rb_proc_new() from intern.h. It should not be considered an official API function yet. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/intern.h?r1=16157&r2=16156&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16157&r2=16156&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/object.c?r1=16157&r2=16156&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/eval.c?r1=16157&r2=16156&diff_format=u Index: ruby_1_8/intern.h =================================================================== --- ruby_1_8/intern.h (revision 16156) +++ ruby_1_8/intern.h (revision 16157) @@ -194,7 +194,6 @@ VALUE rb_class_new_instance _((int, VALUE*, VALUE)); VALUE rb_block_proc _((void)); VALUE rb_f_lambda _((void)); -VALUE rb_proc_new _((VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE)); VALUE rb_proc_call _((VALUE, VALUE)); VALUE rb_obj_method _((VALUE, VALUE)); VALUE rb_protect _((VALUE (*)(VALUE), VALUE, int*)); Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 16156) +++ ruby_1_8/ChangeLog (revision 16157) @@ -1,3 +1,13 @@ +Tue Apr 22 22:43:05 2008 Akinori MUSHA <knu@i...> + + * eval.c (rb_proc_new, YIELD_FUNC_LAMBDA): Add a new nd_state + YIELD_FUNC_LAMBDA which avoids automatic `avalue' conversion for + arguments. This fixes a bug where [1,[2,3]].map(&:object_id) + fails. + + * intern.h, object.c: Hide rb_proc_new() from intern.h. It should + not be considered an official API function yet. + Tue Apr 22 21:24:32 2008 Akinori MUSHA <knu@i...> * eval.c (rb_proc_new): Turn the BLOCK_LAMBDA flag on. Index: ruby_1_8/object.c =================================================================== --- ruby_1_8/object.c (revision 16156) +++ ruby_1_8/object.c (revision 16157) @@ -1225,6 +1225,8 @@ return rb_apply(obj, (ID)mid, args); } +VALUE rb_proc_new _((VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE)); + /* * call-seq: * sym.to_proc Index: ruby_1_8/eval.c =================================================================== --- ruby_1_8/eval.c (revision 16156) +++ ruby_1_8/eval.c (revision 16157) @@ -1111,6 +1111,7 @@ #define YIELD_PUBLIC_DEF 4 #define YIELD_FUNC_AVALUE 1 #define YIELD_FUNC_SVALUE 2 +#define YIELD_FUNC_LAMBDA 3 static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int,VALUE)); static VALUE module_setup _((VALUE,NODE*)); @@ -5014,12 +5015,18 @@ if ((state = EXEC_TAG()) == 0) { redo: if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) { - if (node->nd_state == YIELD_FUNC_AVALUE) { + switch (node->nd_state) { + case YIELD_FUNC_LAMBDA: if (!avalue) { + val = rb_ary_new3(1, val); + } + break; + case YIELD_FUNC_AVALUE: + if (!avalue) { val = svalue_to_avalue(val); } - } - else { + break; + default: if (avalue) { val = avalue_to_svalue(val); } @@ -9635,7 +9642,7 @@ VALUE proc = rb_iterate((VALUE(*)_((VALUE)))mproc, 0, func, val); Data_Get_Struct(proc, struct BLOCK, data); - data->body->nd_state = YIELD_FUNC_AVALUE; + data->body->nd_state = YIELD_FUNC_LAMBDA; data->flags |= BLOCK_LAMBDA; return proc; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/