ruby-changes:64882
From: Nobuyoshi <ko1@a...>
Date: Thu, 14 Jan 2021 16:59:46 +0900 (JST)
Subject: [ruby-changes:64882] c060bdc2b4 (master): NODE markability should not change by nd_set_type
https://git.ruby-lang.org/ruby.git/commit/?id=c060bdc2b4 From c060bdc2b4ab8eeef5374f4174f5de48ab936d74 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Thu, 14 Jan 2021 15:42:45 +0900 Subject: NODE markability should not change by nd_set_type diff --git a/node.c b/node.c index 9b4255b..bef9d7b 100644 --- a/node.c +++ b/node.c @@ -1139,7 +1139,7 @@ void https://github.com/ruby/ruby/blob/trunk/node.c#L1139 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) https://github.com/ruby/ruby/blob/trunk/node.c#L1238 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) https://github.com/ruby/ruby/blob/trunk/node.c#L1254 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 d9dfaa5..192e121 100644 --- a/node.h +++ b/node.h @@ -187,6 +187,8 @@ typedef struct RNode { https://github.com/ruby/ruby/blob/trunk/node.h#L187 #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))<<NODE_TYPESHIFT)&NODE_TYPEMASK)) #define NODE_LSHIFT (NODE_TYPESHIFT+7) @@ -471,9 +473,19 @@ void *rb_parser_realloc(struct parser_params *, void *, size_t); https://github.com/ruby/ruby/blob/trunk/node.h#L473 void *rb_parser_calloc(struct parser_params *, size_t, size_t); void rb_parser_free(struct parser_params *, void *); PRINTF_ARGS(void rb_parser_printf(struct parser_params *parser, const char *fmt, ...), 2, 3); +void rb_ast_node_type_change(NODE *n, enum node_type type); RUBY_SYMBOL_EXPORT_END +static inline VALUE +rb_node_set_type(NODE *n, enum node_type t) +{ +#if RUBY_DEBUG + rb_ast_node_type_change(n, t); +#endif + return nd_init_type(n, t); +} + #if defined(__cplusplus) #if 0 { /* satisfy cc-mode */ -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/