ruby-changes:57572
From: Aaron <ko1@a...>
Date: Fri, 6 Sep 2019 03:05:04 +0900 (JST)
Subject: [ruby-changes:57572] 8f096226e1 (master): Stash tmpbuffer inside internal structs
https://git.ruby-lang.org/ruby.git/commit/?id=8f096226e1 From 8f096226e1b76f95f4d853d3dea2bc75eeeb5244 Mon Sep 17 00:00:00 2001 From: Aaron Patterson <tenderlove@r...> Date: Thu, 5 Sep 2019 11:04:43 -0700 Subject: Stash tmpbuffer inside internal structs I guess those AST node were actually used for something, so we'd better not touch them. Instead this commit just puts the tmpbuffer inside a different internal struct so that we can mark them. diff --git a/node.c b/node.c index 7c73bb8..d844473 100644 --- a/node.c +++ b/node.c @@ -1265,6 +1265,16 @@ mark_ast_value(void *ctx, NODE * node) https://github.com/ruby/ruby/blob/trunk/node.c#L1265 } break; } + case NODE_ARYPTN: + { + struct rb_ary_pattern_info *apinfo = node->nd_apinfo; + rb_gc_mark(apinfo->imemo); + } + case NODE_ARGS: + { + struct rb_args_info *args = node->nd_ainfo; + rb_gc_mark(args->imemo); + } case NODE_LIT: case NODE_STR: case NODE_XSTR: @@ -1272,8 +1282,6 @@ mark_ast_value(void *ctx, NODE * node) https://github.com/ruby/ruby/blob/trunk/node.c#L1282 case NODE_DXSTR: case NODE_DREGX: case NODE_DSYM: - case NODE_ARGS: - case NODE_ARYPTN: rb_gc_mark(node->nd_lit); break; default: diff --git a/node.h b/node.h index 4e78b0f..220438e 100644 --- a/node.h +++ b/node.h @@ -452,12 +452,14 @@ struct rb_args_info { https://github.com/ruby/ruby/blob/trunk/node.h#L452 NODE *opt_args; int no_kwarg; + VALUE imemo; }; struct rb_ary_pattern_info { NODE *pre_args; NODE *rest_arg; NODE *post_args; + VALUE imemo; }; struct parser_params; diff --git a/parse.y b/parse.y index 7a0bbe0..29b8628 100644 --- a/parse.y +++ b/parse.y @@ -11128,8 +11128,9 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block, https://github.com/ruby/ruby/blob/trunk/parse.y#L11128 args = ZALLOC(struct rb_args_info); VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(args); + args->imemo = tmpbuf; RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf); - node = NEW_NODE(NODE_ARGS, tmpbuf, 0, args, &NULL_LOC); + node = NEW_NODE(NODE_ARGS, 0, 0, args, &NULL_LOC); if (p->error_p) return node; args->block_arg = block; @@ -11237,7 +11238,8 @@ new_array_pattern_tail(struct parser_params *p, NODE *pre_args, int has_rest, ID https://github.com/ruby/ruby/blob/trunk/parse.y#L11238 apinfo = ZALLOC(struct rb_ary_pattern_info); VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(apinfo); - node = NEW_NODE(NODE_ARYPTN, tmpbuf, 0, apinfo, loc); + node = NEW_NODE(NODE_ARYPTN, 0, 0, apinfo, loc); + apinfo->imemo = tmpbuf; RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf); apinfo->pre_args = pre_args; -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/