aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryui-knk <spiketeika@gmail.com>2023-10-07 10:24:50 +0900
committerYuichiro Kaneko <spiketeika@gmail.com>2023-10-07 17:54:35 +0900
commitfbd534679fc2bbb6d81c858e47c3b2d51241e840 (patch)
tree3dc2e8c177ab80dc60a87ea3c82530553f6d983f
parentb7ee728a8332645220d4d4732e035a6700216261 (diff)
downloadruby-fbd534679fc2bbb6d81c858e47c3b2d51241e840.tar.gz
Correctly casting node for accessing nd_value and nd_vid in compile.c
-rw-r--r--compile.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/compile.c b/compile.c
index 3e22942bff..42d58e7c1f 100644
--- a/compile.c
+++ b/compile.c
@@ -801,6 +801,37 @@ get_node_colon_nd_mid(const NODE *node)
}
}
+static ID
+get_nd_vid(const NODE *node)
+{
+ switch (nd_type(node)) {
+ case NODE_LASGN:
+ return RNODE_LASGN(node)->nd_vid;
+ case NODE_DASGN:
+ return RNODE_DASGN(node)->nd_vid;
+ case NODE_IASGN:
+ return RNODE_IASGN(node)->nd_vid;
+ case NODE_CVASGN:
+ return RNODE_CVASGN(node)->nd_vid;
+ default:
+ rb_bug("unexpected node: %s", ruby_node_name(nd_type(node)));
+ }
+}
+
+
+static NODE *
+get_nd_value(const NODE *node)
+{
+ switch (nd_type(node)) {
+ case NODE_LASGN:
+ return RNODE_LASGN(node)->nd_value;
+ case NODE_DASGN:
+ return RNODE_DASGN(node)->nd_value;
+ default:
+ rb_bug("unexpected node: %s", ruby_node_name(nd_type(node)));
+ }
+}
+
VALUE
rb_iseq_compile_callback(rb_iseq_t *iseq, const struct rb_iseq_new_with_callback_callback_func * ifunc)
{
@@ -1904,7 +1935,7 @@ iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *const optargs,
node = args->kw_args;
while (node) {
- const NODE *val_node = RNODE_LASGN(node->nd_body)->nd_value;
+ const NODE *val_node = get_nd_value(node->nd_body);
VALUE dv;
if (val_node == NODE_SPECIAL_REQUIRED_KEYWORD) {
@@ -5218,7 +5249,7 @@ compile_massign_opt(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
case NODE_DASGN:
case NODE_IASGN:
case NODE_CVASGN:
- MEMORY(RNODE_LASGN(ln)->nd_vid);
+ MEMORY(get_nd_vid(ln));
break;
default:
return 0;
@@ -9351,7 +9382,7 @@ compile_kw_arg(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
{
struct rb_iseq_constant_body *const body = ISEQ_BODY(iseq);
LABEL *end_label = NEW_LABEL(nd_line(node));
- const NODE *default_value = RNODE_DASGN(RNODE_KW_ARG(node)->nd_body)->nd_value;
+ const NODE *default_value = get_nd_value(RNODE_KW_ARG(node)->nd_body);
if (default_value == NODE_SPECIAL_REQUIRED_KEYWORD) {
/* required argument. do nothing */