Add explicit markers for literal objects generated in parse.y

This is just a preparation to manage AST NODEs out of GC.
Currently `add_mark_object` does nothing.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60481 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mame 2017-10-27 15:06:38 +00:00
parent b03a44c4ac
commit f902ab6d52

47
parse.y
View File

@ -343,6 +343,8 @@ rb_discard_node(NODE *n)
rb_gc_force_recycle((VALUE)n); rb_gc_force_recycle((VALUE)n);
} }
#define add_mark_object(obj) (void)(obj)
#ifndef RIPPER #ifndef RIPPER
static inline void static inline void
set_line_body(NODE *body, int line) set_line_body(NODE *body, int line)
@ -3941,7 +3943,7 @@ symbol_list : /* none */
} }
else { else {
nd_set_type($2, NODE_LIT); nd_set_type($2, NODE_LIT);
$2->nd_lit = rb_str_intern($2->nd_lit); add_mark_object($2->nd_lit = rb_str_intern($2->nd_lit));
} }
$$ = list_append($1, $2, @1.first_column); $$ = list_append($1, $2, @1.first_column);
/*% /*%
@ -4020,8 +4022,8 @@ qsym_list : /* none */
/*%%%*/ /*%%%*/
VALUE lit; VALUE lit;
lit = $2->nd_lit; lit = $2->nd_lit;
$2->nd_lit = ID2SYM(rb_intern_str(lit));
nd_set_type($2, NODE_LIT); nd_set_type($2, NODE_LIT);
add_mark_object($2->nd_lit = ID2SYM(rb_intern_str(lit)));
$$ = list_append($1, $2, @1.first_column); $$ = list_append($1, $2, @1.first_column);
nd_set_column($2, @1.first_column); nd_set_column($2, @1.first_column);
/*% /*%
@ -4240,7 +4242,7 @@ numeric : simple_numeric
{ {
/*%%%*/ /*%%%*/
$$ = $2; $$ = $2;
$$->nd_lit = negate_lit($$->nd_lit); add_mark_object($$->nd_lit = negate_lit($$->nd_lit));
/*% /*%
$$ = dispatch2(unary, ID2VAL(idUMinus), $2); $$ = dispatch2(unary, ID2VAL(idUMinus), $2);
%*/ %*/
@ -4920,7 +4922,7 @@ assoc : arg_value tASSOC arg_value
/*%%%*/ /*%%%*/
if (nd_type($1) == NODE_STR) { if (nd_type($1) == NODE_STR) {
nd_set_type($1, NODE_LIT); nd_set_type($1, NODE_LIT);
$1->nd_lit = rb_fstring($1->nd_lit); add_mark_object($1->nd_lit = rb_fstring($1->nd_lit));
} }
$$ = list_append(new_list($1, @1.first_column), $3, @1.first_column); $$ = list_append(new_list($1, @1.first_column), $3, @1.first_column);
/*% /*%
@ -5503,6 +5505,7 @@ yycompile0(VALUE arg)
if (!opt) opt = rb_obj_hide(rb_ident_hash_new()); if (!opt) opt = rb_obj_hide(rb_ident_hash_new());
rb_hash_aset(opt, rb_sym_intern_ascii_cstr("coverage_enabled"), cov); rb_hash_aset(opt, rb_sym_intern_ascii_cstr("coverage_enabled"), cov);
prelude = NEW_PRELUDE(ruby_eval_tree_begin, body, opt); prelude = NEW_PRELUDE(ruby_eval_tree_begin, body, opt);
add_mark_object(opt);
nd_set_column(prelude, nd_column(body)); nd_set_column(prelude, nd_column(body));
tree->nd_body = prelude; tree->nd_body = prelude;
} }
@ -6480,6 +6483,7 @@ parser_parse_string(struct parser_params *parser, NODE *quote)
int paren = nd_paren(quote); int paren = nd_paren(quote);
int c, space = 0; int c, space = 0;
rb_encoding *enc = current_enc; rb_encoding *enc = current_enc;
VALUE lit;
if (func & STR_FUNC_TERM) { if (func & STR_FUNC_TERM) {
SET_LEX_STATE(EXPR_END|EXPR_ENDARG); SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
@ -6530,7 +6534,8 @@ parser_parse_string(struct parser_params *parser, NODE *quote)
} }
tokfix(); tokfix();
set_yylval_str(STR_NEW3(tok(), toklen(), enc, func)); add_mark_object(lit = STR_NEW3(tok(), toklen(), enc, func));
set_yylval_str(lit);
flush_string_content(enc); flush_string_content(enc);
return tSTRING_CONTENT; return tSTRING_CONTENT;
@ -6544,6 +6549,7 @@ parser_heredoc_identifier(struct parser_params *parser)
long len; long len;
int newline = 0; int newline = 0;
int indent = 0; int indent = 0;
VALUE lit;
if (c == '-') { if (c == '-') {
c = nextc(); c = nextc();
@ -6608,8 +6614,9 @@ parser_heredoc_identifier(struct parser_params *parser)
dispatch_scan_event(tHEREDOC_BEG); dispatch_scan_event(tHEREDOC_BEG);
len = lex_p - lex_pbeg; len = lex_p - lex_pbeg;
lex_goto_eol(parser); lex_goto_eol(parser);
add_mark_object(lit = STR_NEW(tok(), toklen()));
lex_strterm = rb_node_newnode(NODE_HEREDOC, lex_strterm = rb_node_newnode(NODE_HEREDOC,
STR_NEW(tok(), toklen()), /* nd_lit */ lit, /* nd_lit */
len, /* nd_nth */ len, /* nd_nth */
lex_lastline); /* nd_orig */ lex_lastline); /* nd_orig */
parser_set_line(lex_strterm, ruby_sourceline); parser_set_line(lex_strterm, ruby_sourceline);
@ -6794,6 +6801,7 @@ parser_set_number_literal(struct parser_params *parser, VALUE v,
type = tIMAGINARY; type = tIMAGINARY;
} }
set_yylval_literal(v); set_yylval_literal(v);
add_mark_object(v);
SET_LEX_STATE(EXPR_END|EXPR_ENDARG); SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
return type; return type;
} }
@ -6911,6 +6919,7 @@ parser_here_document(struct parser_params *parser, NODE *here)
lex_goto_eol(parser); lex_goto_eol(parser);
if (heredoc_indent > 0) { if (heredoc_indent > 0) {
set_yylval_str(str); set_yylval_str(str);
add_mark_object(str);
flush_string_content(enc); flush_string_content(enc);
return tSTRING_CONTENT; return tSTRING_CONTENT;
} }
@ -6945,8 +6954,10 @@ parser_here_document(struct parser_params *parser, NODE *here)
goto restore; goto restore;
} }
if (c != '\n') { if (c != '\n') {
VALUE lit;
flush: flush:
set_yylval_str(STR_NEW3(tok(), toklen(), enc, func)); add_mark_object(lit = STR_NEW3(tok(), toklen(), enc, func));
set_yylval_str(lit);
flush_string_content(enc); flush_string_content(enc);
return tSTRING_CONTENT; return tSTRING_CONTENT;
} }
@ -6968,6 +6979,7 @@ parser_here_document(struct parser_params *parser, NODE *here)
heredoc_restore(lex_strterm); heredoc_restore(lex_strterm);
lex_strterm = NEW_STRTERM(func | STR_FUNC_TERM, 0, 0); lex_strterm = NEW_STRTERM(func | STR_FUNC_TERM, 0, 0);
set_yylval_str(str); set_yylval_str(str);
add_mark_object(str);
return tSTRING_CONTENT; return tSTRING_CONTENT;
} }
@ -7642,6 +7654,7 @@ parse_qmark(struct parser_params *parser, int space_seen)
{ {
rb_encoding *enc; rb_encoding *enc;
register int c; register int c;
VALUE lit;
if (IS_END()) { if (IS_END()) {
SET_LEX_STATE(EXPR_VALUE); SET_LEX_STATE(EXPR_VALUE);
@ -7724,7 +7737,8 @@ parse_qmark(struct parser_params *parser, int space_seen)
tokadd(c); tokadd(c);
} }
tokfix(); tokfix();
set_yylval_str(STR_NEW3(tok(), toklen(), enc, 0)); add_mark_object(lit = STR_NEW3(tok(), toklen(), enc, 0));
set_yylval_str(lit);
SET_LEX_STATE(EXPR_END); SET_LEX_STATE(EXPR_END);
return tCHAR; return tCHAR;
} }
@ -9264,6 +9278,7 @@ static NODE *
new_regexp_gen(struct parser_params *parser, NODE *node, int options, int column) new_regexp_gen(struct parser_params *parser, NODE *node, int options, int column)
{ {
NODE *list, *prev; NODE *list, *prev;
VALUE lit;
if (!node) { if (!node) {
return new_lit(reg_compile(STR_NEW0(), options), column); return new_lit(reg_compile(STR_NEW0(), options), column);
@ -9273,11 +9288,12 @@ new_regexp_gen(struct parser_params *parser, NODE *node, int options, int column
{ {
VALUE src = node->nd_lit; VALUE src = node->nd_lit;
nd_set_type(node, NODE_LIT); nd_set_type(node, NODE_LIT);
node->nd_lit = reg_compile(src, options); add_mark_object(node->nd_lit = reg_compile(src, options));
} }
break; break;
default: default:
node = NEW_NODE(NODE_DSTR, STR_NEW0(), 1, new_list(node, column)); add_mark_object(lit = STR_NEW0());
node = NEW_NODE(NODE_DSTR, lit, 1, new_list(node, column));
nd_set_column(node, column); nd_set_column(node, column);
case NODE_DSTR: case NODE_DSTR:
nd_set_type(node, NODE_DREGX); nd_set_type(node, NODE_DREGX);
@ -9309,7 +9325,7 @@ new_regexp_gen(struct parser_params *parser, NODE *node, int options, int column
if (!node->nd_next) { if (!node->nd_next) {
VALUE src = node->nd_lit; VALUE src = node->nd_lit;
nd_set_type(node, NODE_LIT); nd_set_type(node, NODE_LIT);
node->nd_lit = reg_compile(src, options); add_mark_object(node->nd_lit = reg_compile(src, options));
} }
if (options & RE_OPTION_ONCE) { if (options & RE_OPTION_ONCE) {
node = NEW_NODE(NODE_SCOPE, 0, node, 0); node = NEW_NODE(NODE_SCOPE, 0, node, 0);
@ -9323,6 +9339,7 @@ static NODE *
new_lit_gen(struct parser_params *parser, VALUE sym, int column) new_lit_gen(struct parser_params *parser, VALUE sym, int column)
{ {
NODE *lit = NEW_LIT(sym); NODE *lit = NEW_LIT(sym);
add_mark_object(sym);
nd_set_column(lit, column); nd_set_column(lit, column);
return lit; return lit;
} }
@ -9339,6 +9356,7 @@ static NODE *
new_str_gen(struct parser_params *parser, VALUE str, int column) new_str_gen(struct parser_params *parser, VALUE str, int column)
{ {
NODE *nd_str = NEW_STR(str); NODE *nd_str = NEW_STR(str);
add_mark_object(str);
nd_set_column(nd_str, column); nd_set_column(nd_str, column);
return nd_str; return nd_str;
} }
@ -9411,6 +9429,7 @@ static NODE *
new_dstr_gen(struct parser_params *parser, VALUE str, int column) new_dstr_gen(struct parser_params *parser, VALUE str, int column)
{ {
NODE *dstr = NEW_DSTR(str); NODE *dstr = NEW_DSTR(str);
add_mark_object(str);
nd_set_column(dstr, column); nd_set_column(dstr, column);
return dstr; return dstr;
} }
@ -9502,7 +9521,9 @@ static NODE *
new_xstring_gen(struct parser_params *parser, NODE *node, int column) new_xstring_gen(struct parser_params *parser, NODE *node, int column)
{ {
if (!node) { if (!node) {
NODE *xstr = NEW_XSTR(STR_NEW0()); VALUE lit = STR_NEW0();
NODE *xstr = NEW_XSTR(lit);
add_mark_object(lit);
nd_set_column(xstr, column); nd_set_column(xstr, column);
return xstr; return xstr;
} }
@ -10645,7 +10666,7 @@ dsym_node_gen(struct parser_params *parser, NODE *node, int column)
break; break;
case NODE_STR: case NODE_STR:
lit = node->nd_lit; lit = node->nd_lit;
node->nd_lit = ID2SYM(rb_intern_str(lit)); add_mark_object(node->nd_lit = ID2SYM(rb_intern_str(lit)));
nd_set_type(node, NODE_LIT); nd_set_type(node, NODE_LIT);
break; break;
default: default: