summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorNARUSE, Yui <naruse@airemix.jp>2021-02-01 19:21:03 +0900
committerNARUSE, Yui <naruse@airemix.jp>2021-02-01 19:21:03 +0900
commit42f02a0bac2c037b4e00a9811c5548c5ec7d28a7 (patch)
treeb8369210f34cdfeef3071489f83e81b22b776730 /parse.y
parent1b0622d7a9451dbeaadccc1f416b71a98271e097 (diff)
merge revision(s) 6bcc4664bdaebbf9b28a762ae63f476a1ec6cfb2,bb40c5cbe977de9f36a2a739e94e9b2fd4496b6e,c060bdc2b4ab8eeef5374f4174f5de48ab936d74: [Backport #17541]
Return new NODE_LIT As NODE_ZLIST/NODE_LIST are not markable, cannot be reused as NODE_LIT. --- parse.y | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) Ensure symbol list node is either NODE_STR or NODE_DSTR --- parse.y | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) NODE markability should not change by nd_set_type --- node.c | 31 +++++++++++++++++++++++++------ node.h | 12 ++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-)
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y18
1 files changed, 10 insertions, 8 deletions
diff --git a/parse.y b/parse.y
index 2c63268b0b..70c4ddfcdc 100644
--- a/parse.y
+++ b/parse.y
@@ -10352,12 +10352,17 @@ new_defined(struct parser_params *p, NODE *expr, const YYLTYPE *loc)
static NODE*
symbol_append(struct parser_params *p, NODE *symbols, NODE *symbol)
{
- if (nd_type(symbol) == NODE_DSTR) {
+ enum node_type type = nd_type(symbol);
+ switch (type) {
+ case NODE_DSTR:
nd_set_type(symbol, NODE_DSYM);
- }
- else {
+ break;
+ case NODE_STR:
nd_set_type(symbol, NODE_LIT);
RB_OBJ_WRITTEN(p->ast, Qnil, symbol->nd_lit = rb_str_intern(symbol->nd_lit));
+ break;
+ default:
+ compile_error(p, "unexpected node as symbol: %s", ruby_node_name(type));
}
return list_append(p, symbols, symbol);
}
@@ -11133,9 +11138,7 @@ shareable_literal_constant(struct parser_params *p, enum shareability shareable,
case NODE_ZLIST:
lit = rb_ary_new();
OBJ_FREEZE_RAW(lit);
- nd_set_type(value, NODE_LIT);
- RB_OBJ_WRITE(p->ast, &value->nd_lit, lit);
- return value;
+ return NEW_LIT(lit, loc);
case NODE_LIST:
lit = rb_ary_new();
@@ -11220,8 +11223,7 @@ shareable_literal_constant(struct parser_params *p, enum shareability shareable,
value = make_shareable_node(p, value, false, loc);
}
else {
- nd_set_type(value, NODE_LIT);
- RB_OBJ_WRITE(p->ast, &value->nd_lit, rb_ractor_make_shareable(lit));
+ value = NEW_LIT(rb_ractor_make_shareable(lit), loc);
}
return value;