summaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-12-30 01:22:11 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-12-31 15:11:38 +0900
commit0fbf4d0374e2cef84761985b043c2255e03f2ff2 (patch)
treecca0c9cc8ba10777a48400221fa67692e52df5e8 /compile.c
parent62450e0acf844510808f18d219aaf7da936b5b58 (diff)
Access to reserved word parameter like as `__builtin.arg!(:if)`
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4015
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/compile.c b/compile.c
index 370a1f4522..97b4a874c5 100644
--- a/compile.c
+++ b/compile.c
@@ -7056,6 +7056,15 @@ compile_evstr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, i
return COMPILE_OK;
}
+static void
+compile_lvar(rb_iseq_t *iseq, LINK_ANCHOR *const ret, int line, ID id)
+{
+ int idx = iseq->body->local_iseq->body->local_table_size - get_local_var_idx(iseq, id);
+
+ debugs("id: %s idx: %d\n", rb_id2name(id), idx);
+ ADD_GETLOCAL(ret, line, idx, get_lvar_level(iseq));
+}
+
static LABEL *
qcall_branch_start(rb_iseq_t *iseq, LINK_ANCHOR *const recv, VALUE *branches, const NODE *node, int line)
{
@@ -7282,6 +7291,20 @@ compile_builtin_function_call(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NOD
iseq->body->builtin_inline_p = true;
return COMPILE_OK;
}
+ else if (strcmp("arg!", builtin_func) == 0) {
+ if (!args_node) goto bad_arg;
+ if (nd_type(args_node) != NODE_LIST) goto bad_arg;
+ if (args_node->nd_next) goto bad_arg;
+ args_node = args_node->nd_head;
+ if (nd_type(args_node) != NODE_LIT) goto bad_arg;
+ if (!SYMBOL_P(args_node->nd_lit)) goto bad_arg;
+ if (!popped) {
+ compile_lvar(iseq, ret, line, SYM2ID(args_node->nd_lit));
+ }
+ return COMPILE_OK;
+ bad_arg:
+ rb_bug("unexpected argument to arg!");
+ }
else if (1) {
rb_bug("can't find builtin function:%s", builtin_func);
}
@@ -8272,11 +8295,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
case NODE_LVAR:{
if (!popped) {
- ID id = node->nd_vid;
- int idx = body->local_iseq->body->local_table_size - get_local_var_idx(iseq, id);
-
- debugs("id: %s idx: %d\n", rb_id2name(id), idx);
- ADD_GETLOCAL(ret, line, idx, get_lvar_level(iseq));
+ compile_lvar(iseq, ret, line, node->nd_vid);
}
break;
}