summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-26 14:19:58 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-26 14:19:58 +0000
commitafb10c62c2e45801df4245e6131af3a98efdebd1 (patch)
tree6fa9986e29f1f972819d260bb2376e732a467868 /gc.c
parent90b1afa3104659898aad5978b164d48e1809e228 (diff)
* 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
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c18
1 files changed, 17 insertions, 1 deletions
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;