diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-21 08:20:51 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-21 08:20:51 +0000 |
commit | 64ae33a18ae0e13444b6ab7c043450b2fe68c62b (patch) | |
tree | 6c46afb9552a6e2095957c4011c4a86fcd8525db /parse.y | |
parent | b8b67c0b9d7fc55a37647064f77a898f34abf89b (diff) |
parse.y: fix GC problem of keyword rest argument
* parse.y (new_args_tail_gen): fix GC problem of keyword rest
argument. the wrapped struct should be bound to the wrapping node
before assignment of child nodes, to get rid of the case the
children are referred by only the struct pointer which is not a
subject of GC. [ruby-core:45744]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36161 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -9289,8 +9289,11 @@ new_args_tail_gen(struct parser_params *parser, NODE *k, ID kr, ID b) int saved_line = ruby_sourceline; struct rb_args_info *args; NODE *kw_rest_arg = 0; + NODE *node; args = ALLOC(struct rb_args_info); + MEMZERO(args, struct rb_args_info, 1); + node = NEW_NODE(NODE_ARGS, 0, 0, args); args->block_arg = b; args->kw_args = k; @@ -9302,7 +9305,7 @@ new_args_tail_gen(struct parser_params *parser, NODE *k, ID kr, ID b) args->kw_rest_arg = kw_rest_arg; ruby_sourceline = saved_line; - return NEW_NODE(NODE_ARGS, 0, 0, args); + return node; } #endif /* !RIPPER */ |