From 815bac77fbda9c053b8ee05f3563592348e64e9f Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 1 Sep 2025 19:42:03 +0900 Subject: [PATCH] mruby-compiler: rename NODE_DSTR/NODE_DXSTR to NODE_STR/NODE_XSTR Rename NODE_DSTR to NODE_STR and NODE_DXSTR to NODE_XSTR to reflect that all strings now use dynamic (cons list) representation. Also rename all associated functions for consistency: - gen_dstr_var() -> gen_str_var() - gen_dxstr_var() -> gen_xstr_var() - codegen_heredoc_dstr() -> codegen_heredoc_str() - codegen_dxstr() -> codegen_xstr() The "D" prefix is no longer meaningful since all strings use the variable-sized cons list format ((len . ptr) (-1 . node)...). Co-authored-by: Claude --- mrbgems/mruby-compiler/core/codegen.c | 36 +++++++++++++-------------- mrbgems/mruby-compiler/core/node.h | 30 ++++++---------------- mrbgems/mruby-compiler/core/parse.y | 26 +++++++++---------- mrbgems/mruby-compiler/core/y.tab.c | 26 +++++++++---------- 4 files changed, 52 insertions(+), 66 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index e321be6ea..5ac30cf25 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -4300,7 +4300,7 @@ codegen_int(codegen_scope *s, node *tree, int val) static void -codegen_dxstr(codegen_scope *s, node *tree, int val) +codegen_xstr(codegen_scope *s, node *tree, int val) { int sym; @@ -4329,7 +4329,7 @@ codegen_symbols(codegen_scope *s, node *tree, int val) /* codegen_cons_list_string forward declaration moved to top of file */ static void -codegen_heredoc_dstr(codegen_scope *s, node *tree, int val) +codegen_heredoc_str(codegen_scope *s, node *tree, int val) { /* Use common cons list string codegen since tree is now in cons list format */ codegen_cons_list_string(s, tree, val); @@ -4864,7 +4864,7 @@ static void codegen_heredoc(codegen_scope *s, node *tree, int val) { tree = ((struct mrb_parser_heredoc_info*)tree)->doc; - codegen_heredoc_dstr(s, tree, val); + codegen_heredoc_str(s, tree, val); } static void @@ -5517,10 +5517,10 @@ gen_super_var(codegen_scope *s, node *varnode, int val) /* Variable-sized literal node generation functions */ static void -gen_dstr_var(codegen_scope *s, node *varnode, int val) +gen_str_var(codegen_scope *s, node *varnode, int val) { - struct mrb_ast_dstr_node *dstr_n = dstr_node(varnode); - node *list = dstr_n->list; + struct mrb_ast_str_node *str_n = str_node(varnode); + node *list = str_n->list; /* Use common cons list string codegen */ codegen_cons_list_string(s, list, val); @@ -5727,9 +5727,9 @@ gen_until_mod_var(codegen_scope *s, node *varnode, int val) static void -gen_dxstr_var(codegen_scope *s, node *varnode, int val) +gen_xstr_var(codegen_scope *s, node *varnode, int val) { - struct mrb_ast_dxstr_node *n = dxstr_node(varnode); + struct mrb_ast_xstr_node *n = xstr_node(varnode); node *list = n->list; int sym; @@ -5812,9 +5812,9 @@ static void gen_dsym_var(codegen_scope *s, node *varnode, int val) { struct mrb_ast_dsym_node *n = (struct mrb_ast_dsym_node*)varnode; - // Generate dstr first, then convert to symbol + // Generate str first, then convert to symbol if (val) { - codegen_heredoc_dstr(s, n->list, VAL); + codegen_heredoc_str(s, n->list, VAL); genop_1(s, OP_INTERN, cursp()); } } @@ -6247,8 +6247,8 @@ codegen_variable_node(codegen_scope *s, node *varnode, int val) gen_super_var(s, varnode, val); return TRUE; - case NODE_DSTR: - gen_dstr_var(s, varnode, val); + case NODE_STR: + gen_str_var(s, varnode, val); return TRUE; case NODE_REGX: @@ -6323,8 +6323,8 @@ codegen_variable_node(codegen_scope *s, node *varnode, int val) gen_until_mod_var(s, varnode, val); return TRUE; - case NODE_DXSTR: - gen_dxstr_var(s, varnode, val); + case NODE_XSTR: + gen_xstr_var(s, varnode, val); return TRUE; case NODE_DREGX: @@ -6677,8 +6677,8 @@ codegen(codegen_scope *s, node *tree, int val) codegen_heredoc(s, tree, val); break; - case NODE_DSTR: - codegen_heredoc_dstr(s, tree, val); + case NODE_STR: + codegen_heredoc_str(s, tree, val); break; case NODE_WORDS: @@ -6689,8 +6689,8 @@ codegen(codegen_scope *s, node *tree, int val) codegen_symbols(s, tree, val); break; - case NODE_DXSTR: - codegen_dxstr(s, tree, val); + case NODE_XSTR: + codegen_xstr(s, tree, val); break; case NODE_REGX: diff --git a/mrbgems/mruby-compiler/core/node.h b/mrbgems/mruby-compiler/core/node.h index d10708aba..d3f686edb 100644 --- a/mrbgems/mruby-compiler/core/node.h +++ b/mrbgems/mruby-compiler/core/node.h @@ -57,8 +57,8 @@ enum node_type { NODE_NEGATE, NODE_LAMBDA, NODE_SYM, - NODE_DSTR, - NODE_DXSTR, + NODE_STR, + NODE_XSTR, NODE_REGX, NODE_DREGX, NODE_DREGX_ONCE, @@ -152,7 +152,7 @@ struct mrb_ast_head_node { struct mrb_ast_var_header { uint16_t lineno; /* Line number information */ uint16_t filename_index; /* File index information */ - uint8_t node_type; /* NODE_INT, NODE_SYM, NODE_DSTR, etc. */ + uint8_t node_type; /* NODE_INT, NODE_SYM, NODE_STR, etc. */ uint8_t size_class; /* Size class for allocation/deallocation */ uint16_t flags; /* Type-specific flags and metadata */ /* Total: 8 bytes header for all variable nodes */ @@ -185,12 +185,10 @@ struct mrb_ast_sym_node { /* Total: 12-16 bytes vs previous 20+ bytes + indirection */ }; -/* Variable-sized string node with inline storage */ +/* Variable-sized string node with cons list */ struct mrb_ast_str_node { - struct mrb_ast_var_header header; /* 8 bytes */ - size_t len; /* String length */ - char data[]; /* Flexible array - inline string storage */ - /* Total: Variable (16 + string_length) vs previous 20+ bytes + separate allocation */ + struct mrb_ast_var_header hdr; + struct mrb_ast_node *list; }; /* Variable-sized integer node */ @@ -508,10 +506,6 @@ struct mrb_ast_super_node { #define SUPER_NODE_ARGS(n) (super_node(n)->args) /* Variable-sized literal node structures */ -struct mrb_ast_dstr_node { - struct mrb_ast_var_header hdr; - struct mrb_ast_node *list; -}; struct mrb_ast_regx_node { struct mrb_ast_var_header hdr; @@ -539,14 +533,13 @@ struct mrb_ast_float_node { }; /* Literal node casting macros */ -#define dstr_node(n) ((struct mrb_ast_dstr_node*)(n)) #define regx_node(n) ((struct mrb_ast_regx_node*)(n)) #define dot2_node(n) ((struct mrb_ast_dot2_node*)(n)) #define dot3_node(n) ((struct mrb_ast_dot3_node*)(n)) #define float_node(n) ((struct mrb_ast_float_node*)(n)) /* Literal node value access macros */ -#define DSTR_NODE_LIST(n) (dstr_node(n)->list) +#define STR_NODE_LIST(n) (str_node(n)->list) #define REGX_NODE_PATTERN(n) (regx_node(n)->pattern) #define REGX_NODE_FLAGS(n) (regx_node(n)->flags) @@ -695,11 +688,6 @@ struct mrb_ast_until_mod_node { // Group 9: String and Regex Variants struct mrb_ast_xstr_node { - struct mrb_ast_var_header hdr; - mrb_sym name; -}; - -struct mrb_ast_dxstr_node { struct mrb_ast_var_header hdr; struct mrb_ast_node *list; }; @@ -728,14 +716,12 @@ struct mrb_ast_dsym_node { }; #define xstr_node(n) ((struct mrb_ast_xstr_node*)(n)) -#define dxstr_node(n) ((struct mrb_ast_dxstr_node*)(n)) #define dregx_node(n) ((struct mrb_ast_dregx_node*)(n)) #define dregx_once_node(n) ((struct mrb_ast_dregx_once_node*)(n)) #define heredoc_node(n) ((struct mrb_ast_heredoc_node*)(n)) #define dsym_node(n) ((struct mrb_ast_dsym_node*)(n)) -#define XSTR_NODE_NAME(n) (xstr_node(n)->name) -#define DXSTR_NODE_LIST(n) (dxstr_node(n)->list) +#define XSTR_NODE_LIST(n) (xstr_node(n)->list) #define DREGX_NODE_LIST(n) (dregx_node(n)->list) #define DREGX_NODE_OPTIONS(n) (dregx_node(n)->options) #define DREGX_ONCE_NODE_LIST(n) (dregx_once_node(n)->list) diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index c97ee29e5..d7fe602a8 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -2161,16 +2161,16 @@ new_float(parser_state *p, const char *s, int suffix) /* Create string node from cons list */ -/* (:dstr . a) */ +/* (:str . a) */ static node* new_str(parser_state *p, node *a) { - size_t total_size = sizeof(struct mrb_ast_dstr_node); + size_t total_size = sizeof(struct mrb_ast_str_node); enum mrb_ast_size_class class = size_to_class(total_size); - struct mrb_ast_dstr_node *n = (struct mrb_ast_dstr_node*)parser_alloc_var(p, total_size, class); + struct mrb_ast_str_node *n = (struct mrb_ast_str_node*)parser_alloc_var(p, total_size, class); - init_var_header(&n->hdr, p, NODE_DSTR, class); + init_var_header(&n->hdr, p, NODE_STR, class); n->list = a; return cons_head((node*)NODE_VARIABLE, (node*)n); @@ -2181,10 +2181,10 @@ new_str(parser_state *p, node *a) static node* new_xstr(parser_state *p, node *a) { - size_t total_size = sizeof(struct mrb_ast_dxstr_node); + size_t total_size = sizeof(struct mrb_ast_xstr_node); enum mrb_ast_size_class class = size_to_class(total_size); - struct mrb_ast_dxstr_node *n = (struct mrb_ast_dxstr_node*)parser_alloc_var(p, total_size, class); - init_var_header(&n->hdr, p, NODE_DXSTR, class); + struct mrb_ast_xstr_node *n = (struct mrb_ast_xstr_node*)parser_alloc_var(p, total_size, class); + init_var_header(&n->hdr, p, NODE_XSTR, class); n->list = a; return cons_head((node*)NODE_VARIABLE, (node*)n); } @@ -2542,8 +2542,8 @@ prohibit_literals(parser_state *p, node *n) else { switch (node_to_type(n->car)) { case NODE_INT: - case NODE_DSTR: - case NODE_DXSTR: + case NODE_STR: + case NODE_XSTR: case NODE_DREGX: case NODE_MATCH: case NODE_FLOAT: @@ -8724,13 +8724,13 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) mrb_parser_dump(mrb, tree, offset+1); break; - case NODE_DSTR: - printf("NODE_DSTR:\n"); + case NODE_STR: + printf("NODE_STR:\n"); dump_recur(mrb, tree, offset+1); break; - case NODE_DXSTR: - printf("NODE_DXSTR:\n"); + case NODE_XSTR: + printf("NODE_XSTR:\n"); dump_recur(mrb, tree, offset+1); break; diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 48e214595..f2d4a58ff 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -2223,16 +2223,16 @@ new_float(parser_state *p, const char *s, int suffix) /* Create string node from cons list */ -/* (:dstr . a) */ +/* (:str . a) */ static node* new_str(parser_state *p, node *a) { - size_t total_size = sizeof(struct mrb_ast_dstr_node); + size_t total_size = sizeof(struct mrb_ast_str_node); enum mrb_ast_size_class class = size_to_class(total_size); - struct mrb_ast_dstr_node *n = (struct mrb_ast_dstr_node*)parser_alloc_var(p, total_size, class); + struct mrb_ast_str_node *n = (struct mrb_ast_str_node*)parser_alloc_var(p, total_size, class); - init_var_header(&n->hdr, p, NODE_DSTR, class); + init_var_header(&n->hdr, p, NODE_STR, class); n->list = a; return cons_head((node*)NODE_VARIABLE, (node*)n); @@ -2243,10 +2243,10 @@ new_str(parser_state *p, node *a) static node* new_xstr(parser_state *p, node *a) { - size_t total_size = sizeof(struct mrb_ast_dxstr_node); + size_t total_size = sizeof(struct mrb_ast_xstr_node); enum mrb_ast_size_class class = size_to_class(total_size); - struct mrb_ast_dxstr_node *n = (struct mrb_ast_dxstr_node*)parser_alloc_var(p, total_size, class); - init_var_header(&n->hdr, p, NODE_DXSTR, class); + struct mrb_ast_xstr_node *n = (struct mrb_ast_xstr_node*)parser_alloc_var(p, total_size, class); + init_var_header(&n->hdr, p, NODE_XSTR, class); n->list = a; return cons_head((node*)NODE_VARIABLE, (node*)n); } @@ -2604,8 +2604,8 @@ prohibit_literals(parser_state *p, node *n) else { switch (node_to_type(n->car)) { case NODE_INT: - case NODE_DSTR: - case NODE_DXSTR: + case NODE_STR: + case NODE_XSTR: case NODE_DREGX: case NODE_MATCH: case NODE_FLOAT: @@ -15549,13 +15549,13 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) mrb_parser_dump(mrb, tree, offset+1); break; - case NODE_DSTR: - printf("NODE_DSTR:\n"); + case NODE_STR: + printf("NODE_STR:\n"); dump_recur(mrb, tree, offset+1); break; - case NODE_DXSTR: - printf("NODE_DXSTR:\n"); + case NODE_XSTR: + printf("NODE_XSTR:\n"); dump_recur(mrb, tree, offset+1); break;