From afb10c62c2e45801df4245e6131af3a98efdebd1 Mon Sep 17 00:00:00 2001 From: mame Date: Mon, 26 Dec 2011 14:19:58 +0000 Subject: * node.h, parse.y (new_args_gen), compile.c (iseq_set_arguments): use struct rb_args_info instead of NODEs. This is a preparation for keyword argument (see [ruby-core:40290]). * node.c (dump_node), gc.c (gc_mark_children, obj_free): bookkeeping. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34134 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- gc.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'gc.c') diff --git a/gc.c b/gc.c index ada7047035..ae2f0c2910 100644 --- a/gc.c +++ b/gc.c @@ -1720,7 +1720,6 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev) case NODE_CALL: case NODE_DEFS: case NODE_OP_ASGN1: - case NODE_ARGS: gc_mark(objspace, (VALUE)obj->as.node.u1.node, lev); /* fall through */ case NODE_SUPER: /* 3 */ @@ -1788,6 +1787,18 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev) ptr = (VALUE)obj->as.node.u2.node; goto again; + case NODE_ARGS: /* custom */ + { + struct rb_args_info *args = obj->as.node.u3.args; + if (args) { + if (args->pre_init) gc_mark(objspace, (VALUE)args->pre_init, lev); + if (args->post_init) gc_mark(objspace, (VALUE)args->post_init, lev); + if (args->opt_args) gc_mark(objspace, (VALUE)args->opt_args, lev); + } + } + ptr = (VALUE)obj->as.node.u2.node; + goto again; + case NODE_ZARRAY: /* - */ case NODE_ZSUPER: case NODE_VCALL: @@ -2381,6 +2392,11 @@ obj_free(rb_objspace_t *objspace, VALUE obj) xfree(RANY(obj)->as.node.u1.tbl); } break; + case NODE_ARGS: + if (RANY(obj)->as.node.u3.args) { + xfree(RANY(obj)->as.node.u3.args); + } + break; case NODE_ALLOCA: xfree(RANY(obj)->as.node.u1.node); break; -- cgit v1.2.3