aboutsummaryrefslogtreecommitdiffstats
path: root/vm_args.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-04 13:50:07 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-04 20:59:46 +0900
commit48f035228044e06634b46d59c8a255455cbddd70 (patch)
treedc3dc8c77c6f3736cbee174490a7d3e7fc946878 /vm_args.c
parent0dc0c24cadb231091bb4dbe68860b2bd41713253 (diff)
downloadruby-48f035228044e06634b46d59c8a255455cbddd70.tar.gz
Fetch the last element only when not empty
Also `flag_keyword_hash` sets to 0 or a hash object.
Diffstat (limited to 'vm_args.c')
-rw-r--r--vm_args.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/vm_args.c b/vm_args.c
index 677f37c55a..a02e08d7fc 100644
--- a/vm_args.c
+++ b/vm_args.c
@@ -560,11 +560,10 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
args->rest = locals[--args->argc];
int len = RARRAY_LENINT(args->rest);
given_argc += len - 1;
- rest_last = RARRAY_AREF(args->rest, len - 1);
if (!kw_flag && len > 0) {
- if (RB_TYPE_P(rest_last, T_HASH) &&
- (((struct RHash *)rest_last)->basic.flags & RHASH_PASS_AS_KEYWORDS)) {
+ rest_last = RARRAY_AREF(args->rest, len - 1);
+ if (RB_TYPE_P(rest_last, T_HASH) && FL_TEST_RAW(rest_last, RHASH_PASS_AS_KEYWORDS)) {
// def f(**kw); a = [..., kw]; g(*a)
splat_flagged_keyword_hash = rest_last;
rest_last = rb_hash_dup(rest_last);
@@ -595,9 +594,6 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
}
}
}
- else {
- rest_last = 0;
- }
}
else {
args->rest = Qfalse;
@@ -628,8 +624,8 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
}
}
- if (flag_keyword_hash && RB_TYPE_P(flag_keyword_hash, T_HASH)) {
- ((struct RHash *)flag_keyword_hash)->basic.flags |= RHASH_PASS_AS_KEYWORDS;
+ if (flag_keyword_hash) {
+ FL_SET_RAW(flag_keyword_hash, RHASH_PASS_AS_KEYWORDS);
}
if (kw_flag && ISEQ_BODY(iseq)->param.flags.accepts_no_kwarg) {