From 48f035228044e06634b46d59c8a255455cbddd70 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 4 Aug 2023 13:50:07 +0900 Subject: [PATCH] Fetch the last element only when not empty Also `flag_keyword_hash` sets to 0 or a hash object. --- vm_args.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/vm_args.c b/vm_args.c index 677f37c55a069b..a02e08d7fc2433 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) {