diff options
author | yui-knk <[email protected]> | 2023-10-07 10:24:50 +0900 |
---|---|---|
committer | Yuichiro Kaneko <[email protected]> | 2023-10-07 17:54:35 +0900 |
commit | fbd534679fc2bbb6d81c858e47c3b2d51241e840 (patch) | |
tree | 3dc2e8c177ab80dc60a87ea3c82530553f6d983f /compile.c | |
parent | b7ee728a8332645220d4d4732e035a6700216261 (diff) |
Correctly casting node for accessing nd_value and nd_vid in compile.c
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 37 |
1 files changed, 34 insertions, 3 deletions
@@ -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 */ |