1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@16157 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
knu 2008-04-22 13:51:44 +00:00
parent 56b9d66662
commit bc3ce4588d
4 changed files with 23 additions and 5 deletions

View file

@ -1,3 +1,13 @@
Tue Apr 22 22:43:05 2008 Akinori MUSHA <knu@iDaemons.org>
* 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@iDaemons.org>
* eval.c (rb_proc_new): Turn the BLOCK_LAMBDA flag on.

15
eval.c
View file

@ -1111,6 +1111,7 @@ static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
#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 @@ rb_yield_0(val, self, klass, flags, avalue)
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 @@ rb_proc_new(func, val)
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;
}

View file

@ -194,7 +194,6 @@ void rb_obj_call_init _((VALUE, int, VALUE*));
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*));

View file

@ -1225,6 +1225,8 @@ sym_call(args, mid)
return rb_apply(obj, (ID)mid, args);
}
VALUE rb_proc_new _((VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE));
/*
* call-seq:
* sym.to_proc