mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* eval.c (rb_iterate): NODE_CFUNC does not protect its data
(nd_tval), so create new node NODE_IFUNC for iteration C function. * eval.c (rb_yield_0): use NODE_IFUNC. * gc.c (rb_gc_mark): support NODE_IFUNC. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1088 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
4c1441870e
commit
7d10fe689c
4 changed files with 15 additions and 2 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Sat Dec 30 03:14:22 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* eval.c (rb_iterate): NODE_CFUNC does not protect its data
|
||||
(nd_tval), so create new node NODE_IFUNC for iteration C
|
||||
function.
|
||||
|
||||
* eval.c (rb_yield_0): use NODE_IFUNC.
|
||||
|
||||
* gc.c (rb_gc_mark): support NODE_IFUNC.
|
||||
|
||||
Fri Dec 29 11:41:55 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* gc.c (mem_error): prohibit recursive mem_error().
|
||||
|
|
4
eval.c
4
eval.c
|
@ -3526,7 +3526,7 @@ rb_yield_0(val, self, klass, acheck)
|
|||
if (!node) {
|
||||
result = Qnil;
|
||||
}
|
||||
else if (nd_type(node) == NODE_CFUNC) {
|
||||
else if (nd_type(node) == NODE_IFUNC) {
|
||||
if (val == Qundef) val = rb_ary_new2(0);
|
||||
result = (*node->nd_cfnc)(val, node->nd_tval, self);
|
||||
}
|
||||
|
@ -3745,7 +3745,7 @@ rb_iterate(it_proc, data1, bl_proc, data2)
|
|||
{
|
||||
int state;
|
||||
volatile VALUE retval = Qnil;
|
||||
NODE *node = NEW_CFUNC(bl_proc, data2);
|
||||
NODE *node = NEW_IFUNC(bl_proc, data2);
|
||||
VALUE self = ruby_top_self;
|
||||
|
||||
iter_retry:
|
||||
|
|
1
gc.c
1
gc.c
|
@ -480,6 +480,7 @@ rb_gc_mark(ptr)
|
|||
case NODE_OP_ASGN_AND:
|
||||
rb_gc_mark(obj->as.node.u1.node);
|
||||
/* fall through */
|
||||
case NODE_IFUNC:
|
||||
case NODE_METHOD: /* 2 */
|
||||
case NODE_NOT:
|
||||
case NODE_GASGN:
|
||||
|
|
2
node.h
2
node.h
|
@ -21,6 +21,7 @@ enum node_type {
|
|||
NODE_METHOD,
|
||||
NODE_FBODY,
|
||||
NODE_CFUNC,
|
||||
NODE_IFUNC,
|
||||
NODE_SCOPE,
|
||||
NODE_BLOCK,
|
||||
NODE_IF,
|
||||
|
@ -234,6 +235,7 @@ typedef struct RNode {
|
|||
#define NEW_DEFN(i,a,d,p) rb_node_newnode(NODE_DEFN,p,i,NEW_RFUNC(a,d))
|
||||
#define NEW_DEFS(r,i,a,d) rb_node_newnode(NODE_DEFS,r,i,NEW_RFUNC(a,d))
|
||||
#define NEW_CFUNC(f,c) rb_node_newnode(NODE_CFUNC,f,c,0)
|
||||
#define NEW_IFUNC(f,c) rb_node_newnode(NODE_IFUNC,f,c,0)
|
||||
#define NEW_RFUNC(b1,b2) NEW_SCOPE(block_append(b1,b2))
|
||||
#define NEW_SCOPE(b) rb_node_newnode(NODE_SCOPE,local_tbl(),cur_cref,(b))
|
||||
#define NEW_BLOCK(a) rb_node_newnode(NODE_BLOCK,a,0,0)
|
||||
|
|
Loading…
Add table
Reference in a new issue