Take care of internal node type

In parse.y, node can be NODE_DEF_TEMP or NODE_EXITS.
Hit "unknown node" without taking care of them.
For example `ruby --dump=y lib/cgi/util.rb` causes
"[BUG] unknown node: 107".
This commit is contained in:
yui-knk 2023-10-08 19:53:29 +09:00 committed by Yuichiro Kaneko
parent a78acf18ac
commit b9a2348632

27
parse.y
View File

@ -1087,6 +1087,19 @@ enum internal_node_type {
NODE_INTERNAL_LAST NODE_INTERNAL_LAST
}; };
static const char *
parser_node_name(int node)
{
switch (node) {
case NODE_DEF_TEMP:
return "NODE_DEF_TEMP";
case NODE_EXITS:
return "NODE_EXITS";
default:
return ruby_node_name(node);
}
}
/* This node is parse.y internal */ /* This node is parse.y internal */
typedef struct RNode_DEF_TEMP { typedef struct RNode_DEF_TEMP {
NODE node; NODE node;
@ -1726,7 +1739,7 @@ add_block_exit(struct parser_params *p, NODE *node)
switch (nd_type(node)) { switch (nd_type(node)) {
case NODE_BREAK: case NODE_NEXT: case NODE_REDO: break; case NODE_BREAK: case NODE_NEXT: case NODE_REDO: break;
default: default:
compile_error(p, "unexpected node: %s", ruby_node_name(nd_type(node))); compile_error(p, "unexpected node: %s", parser_node_name(nd_type(node)));
return node; return node;
} }
if (!p->ctxt.in_defined) { if (!p->ctxt.in_defined) {
@ -1813,7 +1826,7 @@ get_nd_value(struct parser_params *p, NODE *node)
case NODE_MASGN: case NODE_MASGN:
return RNODE_MASGN(node)->nd_value; return RNODE_MASGN(node)->nd_value;
default: default:
compile_error(p, "unexpected node: %s", ruby_node_name(nd_type(node))); compile_error(p, "unexpected node: %s", parser_node_name(nd_type(node)));
return 0; return 0;
} }
} }
@ -1844,7 +1857,7 @@ set_nd_value(struct parser_params *p, NODE *node, NODE *rhs)
RNODE_CVASGN(node)->nd_value = rhs; RNODE_CVASGN(node)->nd_value = rhs;
break; break;
default: default:
compile_error(p, "unexpected node: %s", ruby_node_name(nd_type(node))); compile_error(p, "unexpected node: %s", parser_node_name(nd_type(node)));
break; break;
} }
} }
@ -1866,7 +1879,7 @@ get_nd_vid(struct parser_params *p, NODE *node)
case NODE_CVASGN: case NODE_CVASGN:
return RNODE_CVASGN(node)->nd_vid; return RNODE_CVASGN(node)->nd_vid;
default: default:
compile_error(p, "unexpected node: %s", ruby_node_name(nd_type(node))); compile_error(p, "unexpected node: %s", parser_node_name(nd_type(node)));
return 0; return 0;
} }
} }
@ -1892,7 +1905,7 @@ get_nd_args(struct parser_params *p, NODE *node)
case NODE_NEXT: case NODE_NEXT:
return 0; return 0;
default: default:
compile_error(p, "unexpected node: %s", ruby_node_name(nd_type(node))); compile_error(p, "unexpected node: %s", parser_node_name(nd_type(node)));
return 0; return 0;
} }
} }
@ -1908,7 +1921,7 @@ get_nd_args(struct parser_params *p, NODE *node)
rb_parser_printf(p, "NODE_SPECIAL"); rb_parser_printf(p, "NODE_SPECIAL");
} }
else if ($$) { else if ($$) {
rb_parser_printf(p, "%s", ruby_node_name(nd_type(RNODE($$)))); rb_parser_printf(p, "%s", parser_node_name(nd_type(RNODE($$))));
} }
#else #else
#endif #endif
@ -12790,7 +12803,7 @@ symbol_append(struct parser_params *p, NODE *symbols, NODE *symbol)
RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_STR(symbol)->nd_lit = rb_str_intern(RNODE_STR(symbol)->nd_lit)); RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_STR(symbol)->nd_lit = rb_str_intern(RNODE_STR(symbol)->nd_lit));
break; break;
default: default:
compile_error(p, "unexpected node as symbol: %s", ruby_node_name(type)); compile_error(p, "unexpected node as symbol: %s", parser_node_name(type));
} }
return list_append(p, symbols, symbol); return list_append(p, symbols, symbol);
} }