[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]