From 42f02a0bac2c037b4e00a9811c5548c5ec7d28a7 Mon Sep 17 00:00:00 2001 From: "NARUSE, Yui" Date: Mon, 1 Feb 2021 19:21:03 +0900 Subject: 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(-) --- node.c | 31 +++++++++++++++++++++++++------ node.h | 12 ++++++++++++ parse.y | 18 ++++++++++-------- version.h | 2 +- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/node.c b/node.c index 9b4255bf4a..bef9d7bcbd 100644 --- a/node.c +++ b/node.c @@ -1139,7 +1139,7 @@ void rb_node_init(NODE *n, enum node_type type, VALUE a0, VALUE a1, VALUE a2) { n->flags = T_NODE; - nd_set_type(n, type); + nd_init_type(n, type); n->u1.value = a0; n->u2.value = a1; n->u3.value = a2; @@ -1238,10 +1238,10 @@ ast_newnode_in_bucket(node_buffer_list_t *nb) return &nb->head->buf[nb->idx++]; } -NODE * -rb_ast_newnode(rb_ast_t *ast, enum node_type type) +RBIMPL_ATTR_PURE() +static bool +nodetype_markable_p(enum node_type type) { - node_buffer_t *nb = ast->node_buffer; switch (type) { case NODE_MATCH: case NODE_LIT: @@ -1254,9 +1254,28 @@ rb_ast_newnode(rb_ast_t *ast, enum node_type type) case NODE_ARGS: case NODE_ARYPTN: case NODE_FNDPTN: - return ast_newnode_in_bucket(&nb->markable); + return true; default: - return ast_newnode_in_bucket(&nb->unmarkable); + return false; + } +} + +NODE * +rb_ast_newnode(rb_ast_t *ast, enum node_type type) +{ + node_buffer_t *nb = ast->node_buffer; + node_buffer_list_t *bucket = + (nodetype_markable_p(type) ? &nb->markable : &nb->unmarkable); + return ast_newnode_in_bucket(bucket); +} + +void +rb_ast_node_type_change(NODE *n, enum node_type type) +{ + enum node_type old_type = nd_type(n); + if (nodetype_markable_p(old_type) != nodetype_markable_p(type)) { + rb_bug("node type changed: %s -> %s", + ruby_node_name(old_type), ruby_node_name(type)); } } diff --git a/node.h b/node.h index d9dfaa5c2d..192e121fd7 100644 --- a/node.h +++ b/node.h @@ -187,6 +187,8 @@ typedef struct RNode { #define nd_type(n) ((int) (((n)->flags & NODE_TYPEMASK)>>NODE_TYPESHIFT)) #define nd_set_type(n,t) \ + rb_node_set_type(n, t) +#define nd_init_type(n,t) \ (n)->flags=(((n)->flags&~NODE_TYPEMASK)|((((unsigned long)(t))<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; diff --git a/version.h b/version.h index ced3fdb62e..d106a98cf3 100644 --- a/version.h +++ b/version.h @@ -12,7 +12,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 18 +#define RUBY_PATCHLEVEL 19 #define RUBY_RELEASE_YEAR 2021 #define RUBY_RELEASE_MONTH 2 -- cgit v1.2.3