1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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.
This commit is contained in:
Aaron Patterson 2019-09-05 11:04:43 -07:00
parent 8cd845aa5b
commit 8f096226e1
No known key found for this signature in database
GPG key ID: 953170BCB4FFAFC6
3 changed files with 16 additions and 4 deletions

12
node.c
View file

@ -1265,6 +1265,16 @@ mark_ast_value(void *ctx, NODE * node)
}
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)
case NODE_DXSTR:
case NODE_DREGX:
case NODE_DSYM:
case NODE_ARGS:
case NODE_ARYPTN:
rb_gc_mark(node->nd_lit);
break;
default:

2
node.h
View file

@ -452,12 +452,14 @@ struct rb_args_info {
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;

View file

@ -11128,8 +11128,9 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block,
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
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;