diff options
author | Nobuyoshi Nakada <[email protected]> | 2023-08-04 13:50:07 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2023-08-04 20:59:46 +0900 |
commit | 48f035228044e06634b46d59c8a255455cbddd70 (patch) | |
tree | dc3dc8c77c6f3736cbee174490a7d3e7fc946878 /vm_args.c | |
parent | 0dc0c24cadb231091bb4dbe68860b2bd41713253 (diff) |
Fetch the last element only when not empty
Also `flag_keyword_hash` sets to 0 or a hash object.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/8173
Diffstat (limited to 'vm_args.c')
-rw-r--r-- | vm_args.c | 12 |
1 files changed, 4 insertions, 8 deletions
@@ -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) { |