mruby-compiler: remove old NODE_REGX and consolidate with NODE_DREGX

Remove the original NODE_REGX node type and related infrastructure,
then rename NODE_DREGX to NODE_REGX to consolidate regex handling
under a single node type.

Changes based on git diff:
- Remove original mrb_ast_regx_node structure with pattern fields
- Remove gen_regx_var() function handling literal regex patterns
- Remove NODE_REGX case from codegen and parser dump
- Rename NODE_DREGX to NODE_REGX for dynamic regex expressions
- Update all related functions and structure references

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-09-26 04:59:35 +09:00
parent dc67cb795f
commit 7d72da2842
4 changed files with 24 additions and 109 deletions
+4 -50
View File
@@ -4694,48 +4694,6 @@ gen_str_var(codegen_scope *s, node *varnode, int val)
gen_string(s, list, val);
}
static void
gen_regx_var(codegen_scope *s, node *varnode, int val)
{
if (val) {
struct mrb_ast_regx_node *regx_n = regx_node(varnode->car);
const char *p1 = REGX_NODE_PATTERN(regx_n);
const char *p2 = REGX_NODE_FLAGS(regx_n);
const char *p3 = REGX_NODE_ENCODING(regx_n);
int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
int off = new_lit_cstr(s, p1);
int argc = 1;
genop_1(s, OP_OCLASS, cursp());
genop_2(s, OP_GETMCNST, cursp(), sym);
push();
genop_2(s, OP_STRING, cursp(), off);
push();
if (p2 || p3) {
if (p2) { /* opt */
off = new_lit_cstr(s, p2);
genop_2(s, OP_STRING, cursp(), off);
}
else {
genop_1(s, OP_LOADNIL, cursp());
}
push();
argc++;
if (p3) { /* enc */
off = new_lit_str(s, p3, 1);
genop_2(s, OP_STRING, cursp(), off);
push();
argc++;
}
}
push(); /* space for a block */
pop_n(argc+2);
sym = new_sym(s, MRB_SYM_2(s->mrb, compile));
genop_3(s, OP_SEND, cursp(), sym, argc);
push();
}
}
static void
gen_dot2_var(codegen_scope *s, node *varnode, int val)
{
@@ -5019,9 +4977,9 @@ gen_xstr_var(codegen_scope *s, node *varnode, int val)
}
static void
gen_dregx_var(codegen_scope *s, node *varnode, int val)
gen_regx_var(codegen_scope *s, node *varnode, int val)
{
struct mrb_ast_dregx_node *n = dregx_node(varnode);
struct mrb_ast_regx_node *n = regx_node(varnode);
if (val) {
int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
@@ -5656,10 +5614,6 @@ codegen(codegen_scope *s, node *tree, int val)
gen_str_var(s, tree, val);
break;
case NODE_REGX:
gen_regx_var(s, tree, val);
break;
case NODE_DOT2:
gen_dot2_var(s, tree, val);
break;
@@ -5728,8 +5682,8 @@ codegen(codegen_scope *s, node *tree, int val)
gen_xstr_var(s, tree, val);
break;
case NODE_DREGX:
gen_dregx_var(s, tree, val);
case NODE_REGX:
gen_regx_var(s, tree, val);
break;
case NODE_HEREDOC:
+4 -19
View File
@@ -58,7 +58,6 @@ enum node_type {
NODE_STR,
NODE_XSTR,
NODE_REGX,
NODE_DREGX,
NODE_SPLAT,
NODE_TO_ARY,
NODE_SVALUE,
@@ -465,14 +464,6 @@ struct mrb_ast_super_node {
/* Variable-sized literal node structures */
struct mrb_ast_regx_node {
struct mrb_ast_var_header header;
const char *pattern;
int pattern_len;
const char *flags;
const char *encoding;
};
struct mrb_ast_dot2_node {
struct mrb_ast_var_header header;
struct mrb_ast_node *left;
@@ -491,7 +482,6 @@ struct mrb_ast_float_node {
};
/* Literal node casting macros */
#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))
@@ -499,10 +489,6 @@ struct mrb_ast_float_node {
/* Literal node value access macros */
#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)
#define REGX_NODE_ENCODING(n) (regx_node(n)->encoding)
#define DOT2_NODE_LEFT(n) (dot2_node(n)->left)
#define DOT2_NODE_RIGHT(n) (dot2_node(n)->right)
@@ -639,14 +625,13 @@ struct mrb_ast_xstr_node {
struct mrb_ast_node *list;
};
struct mrb_ast_dregx_node {
struct mrb_ast_regx_node {
struct mrb_ast_var_header header;
struct mrb_ast_node *list;
const char *flags;
const char *encoding;
};
struct mrb_ast_heredoc_node {
struct mrb_ast_var_header header;
struct mrb_parser_heredoc_info info;
@@ -658,13 +643,13 @@ struct mrb_ast_dsym_node {
};
#define xstr_node(n) ((struct mrb_ast_xstr_node*)(n))
#define dregx_node(n) ((struct mrb_ast_dregx_node*)(n))
#define regx_node(n) ((struct mrb_ast_regx_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_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 REGX_NODE_LIST(n) (regx_node(n)->list)
#define REGX_NODE_OPTIONS(n) (regx_node(n)->options)
#define HEREDOC_NODE_NAME(n) (heredoc_node(n)->name)
#define DSYM_NODE_LIST(n) (dsym_node(n)->list)
+8 -20
View File
@@ -1482,12 +1482,12 @@ new_dsym(parser_state *p, node *a)
return (node*)n;
}
/* (:dregx . (list . (flags . encoding))) */
/* (:regx . (list . (flags . encoding))) */
static node*
new_dregx(parser_state *p, node *list, const char *flags, const char *encoding)
new_regx(parser_state *p, node *list, const char *flags, const char *encoding)
{
struct mrb_ast_dregx_node *n = (struct mrb_ast_dregx_node*)parser_palloc(p, sizeof(struct mrb_ast_dregx_node));
init_var_header(&n->header, p, NODE_DREGX);
struct mrb_ast_regx_node *n = (struct mrb_ast_regx_node*)parser_palloc(p, sizeof(struct mrb_ast_regx_node));
init_var_header(&n->header, p, NODE_REGX);
n->list = list;
n->flags = flags;
n->encoding = encoding;
@@ -1893,7 +1893,7 @@ prohibit_literals(parser_state *p, node *n)
case NODE_INT:
case NODE_STR:
case NODE_XSTR:
case NODE_DREGX:
case NODE_REGX:
case NODE_MATCH:
case NODE_FLOAT:
case NODE_ARRAY:
@@ -3870,7 +3870,7 @@ regexp : tREGEXP_BEG tREGEXP
const char *encoding = (const char*)data->cdr->cdr;
/* Use data->car directly as pattern_list: (len . pattern) */
node *pattern_list = cons(data->car, (node*)NULL);
$$ = new_dregx(p, pattern_list, flags, encoding);
$$ = new_regx(p, pattern_list, flags, encoding);
}
| tREGEXP_BEG string_rep tREGEXP
{
@@ -3879,7 +3879,7 @@ regexp : tREGEXP_BEG tREGEXP
const char *encoding = (const char*)data->cdr->cdr;
/* Append the pattern from $3->car to the string list $2 */
node *complete_list = push($2, data->car);
$$ = new_dregx(p, complete_list, flags, encoding);
$$ = new_regx(p, complete_list, flags, encoding);
}
;
@@ -8213,19 +8213,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
break;
case NODE_REGX:
printf("NODE_REGX /%s/\n", (char*)tree->car);
if (tree->cdr->car) {
dump_prefix(offset+1, lineno);
printf("opt: %s\n", (char*)tree->cdr->car);
}
if (tree->cdr->cdr) {
dump_prefix(offset+1, lineno);
printf("enc: %s\n", (char*)tree->cdr->cdr);
}
break;
case NODE_DREGX:
printf("NODE_DREGX:\n");
printf("NODE_REGX:\n");
dump_recur(mrb, tree->car, offset+1);
dump_prefix(offset+1, lineno);
printf("tail: %s\n", (char*)tree->cdr->cdr->car);
+8 -20
View File
@@ -1544,12 +1544,12 @@ new_dsym(parser_state *p, node *a)
return (node*)n;
}
/* (:dregx . (list . (flags . encoding))) */
/* (:regx . (list . (flags . encoding))) */
static node*
new_dregx(parser_state *p, node *list, const char *flags, const char *encoding)
new_regx(parser_state *p, node *list, const char *flags, const char *encoding)
{
struct mrb_ast_dregx_node *n = (struct mrb_ast_dregx_node*)parser_palloc(p, sizeof(struct mrb_ast_dregx_node));
init_var_header(&n->header, p, NODE_DREGX);
struct mrb_ast_regx_node *n = (struct mrb_ast_regx_node*)parser_palloc(p, sizeof(struct mrb_ast_regx_node));
init_var_header(&n->header, p, NODE_REGX);
n->list = list;
n->flags = flags;
n->encoding = encoding;
@@ -1955,7 +1955,7 @@ prohibit_literals(parser_state *p, node *n)
case NODE_INT:
case NODE_STR:
case NODE_XSTR:
case NODE_DREGX:
case NODE_REGX:
case NODE_MATCH:
case NODE_FLOAT:
case NODE_ARRAY:
@@ -10152,7 +10152,7 @@ yyreduce:
const char *encoding = (const char*)data->cdr->cdr;
/* Use data->car directly as pattern_list: (len . pattern) */
node *pattern_list = cons(data->car, (node*)NULL);
(yyval.nd) = new_dregx(p, pattern_list, flags, encoding);
(yyval.nd) = new_regx(p, pattern_list, flags, encoding);
}
#line 10158 "mrbgems/mruby-compiler/core/y.tab.c"
break;
@@ -10165,7 +10165,7 @@ yyreduce:
const char *encoding = (const char*)data->cdr->cdr;
/* Append the pattern from $3->car to the string list $2 */
node *complete_list = push((yyvsp[-1].nd), data->car);
(yyval.nd) = new_dregx(p, complete_list, flags, encoding);
(yyval.nd) = new_regx(p, complete_list, flags, encoding);
}
#line 10171 "mrbgems/mruby-compiler/core/y.tab.c"
break;
@@ -15042,19 +15042,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
break;
case NODE_REGX:
printf("NODE_REGX /%s/\n", (char*)tree->car);
if (tree->cdr->car) {
dump_prefix(offset+1, lineno);
printf("opt: %s\n", (char*)tree->cdr->car);
}
if (tree->cdr->cdr) {
dump_prefix(offset+1, lineno);
printf("enc: %s\n", (char*)tree->cdr->cdr);
}
break;
case NODE_DREGX:
printf("NODE_DREGX:\n");
printf("NODE_REGX:\n");
dump_recur(mrb, tree->car, offset+1);
dump_prefix(offset+1, lineno);
printf("tail: %s\n", (char*)tree->cdr->cdr->car);