diff options
author | Koichi Sasada <[email protected]> | 2024-06-13 11:48:48 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2024-06-13 13:52:39 +0900 |
commit | fc33559c40e08e4ae0a98821a679abddc4bb247c (patch) | |
tree | 19bb81167633e85dbfcd8d4a37ebed8c87abfefa /vm_args.c | |
parent | e4385baaa2bfe4c0a6540f4c996df4ccff71cdca (diff) |
clear `kw_flag` if given hash is nil
https://bugs.ruby-lang.org/issues/20570 is caused I missed to
clear the `kw_flag` even if `keyword_hash` is nil.
Diffstat (limited to 'vm_args.c')
-rw-r--r-- | vm_args.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -524,10 +524,9 @@ static inline int ignore_keyword_hash_p(VALUE keyword_hash, const rb_iseq_t * const iseq, unsigned int * kw_flag, VALUE * converted_keyword_hash) { if (keyword_hash == Qnil) { - return 1; + goto ignore; } - - if (!RB_TYPE_P(keyword_hash, T_HASH)) { + else if (!RB_TYPE_P(keyword_hash, T_HASH)) { keyword_hash = rb_to_hash_type(keyword_hash); } else if (UNLIKELY(ISEQ_BODY(iseq)->param.flags.anon_kwrest)) { @@ -543,9 +542,17 @@ ignore_keyword_hash_p(VALUE keyword_hash, const rb_iseq_t * const iseq, unsigned keyword_hash = rb_hash_dup(keyword_hash); } *converted_keyword_hash = keyword_hash; - return !(ISEQ_BODY(iseq)->param.flags.has_kw) && - !(ISEQ_BODY(iseq)->param.flags.has_kwrest) && - RHASH_EMPTY_P(keyword_hash); + + if (!(ISEQ_BODY(iseq)->param.flags.has_kw) && + !(ISEQ_BODY(iseq)->param.flags.has_kwrest) && + RHASH_EMPTY_P(keyword_hash)) { + ignore: + *kw_flag &= ~(VM_CALL_KW_SPLAT | VM_CALL_KW_SPLAT_MUT); + return 1; + } + else { + return 0; + } } static VALUE @@ -699,7 +706,6 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co rb_ary_pop(args->rest); } given_argc--; - kw_flag &= ~(VM_CALL_KW_SPLAT | VM_CALL_KW_SPLAT_MUT); } else { if (rest_last != converted_keyword_hash) { @@ -730,7 +736,6 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co if (ignore_keyword_hash_p(last_arg, iseq, &kw_flag, &converted_keyword_hash)) { args->argc--; given_argc--; - kw_flag &= ~(VM_CALL_KW_SPLAT | VM_CALL_KW_SPLAT_MUT); } else { if (!(kw_flag & VM_CALL_KW_SPLAT_MUT) && !ISEQ_BODY(iseq)->param.flags.has_kw) { |