Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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
  • Loading branch information...
commit 64ae33a18ae0e13444b6ab7c043450b2fe68c62b 1 parent b8b67c0
@nobu nobu authored
Showing with 16 additions and 1 deletion.
  1. +8 −0 ChangeLog
  2. +4 −1 parse.y
  3. +4 −0 test/ruby/test_syntax.rb
View
8 ChangeLog
@@ -1,3 +1,11 @@
+Thu Jun 21 17:20:44 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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]
+
Thu Jun 21 07:06:52 2012 Koichi Sasada <ko1@atdot.net>
* error.c (err_append): rename err_append() to compile_err_append()
View
5 parse.y
@@ -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 */
View
4 test/ruby/test_syntax.rb
@@ -88,6 +88,10 @@ def o.kw(**a) a end
assert_equal({}, o.kw, bug5989)
assert_equal({foo: 1}, o.kw(foo: 1), bug5989)
assert_equal({foo: 1, bar: 2}, o.kw(foo: 1, bar: 2), bug5989)
+ EnvUtil.under_gc_stress do
+ eval("def o.m(k: 0) k end")
+ end
+ assert_equal(42, o.m(k: 42), '[ruby-core:45744]')
end
def test_keyword_splat
Please sign in to comment.
Something went wrong with that request. Please try again.