summaryrefslogtreecommitdiff
path: root/vm_args.c
diff options
context:
space:
mode:
authorKoichi Sasada <[email protected]>2024-06-13 11:48:48 +0900
committerKoichi Sasada <[email protected]>2024-06-13 13:52:39 +0900
commitfc33559c40e08e4ae0a98821a679abddc4bb247c (patch)
tree19bb81167633e85dbfcd8d4a37ebed8c87abfefa /vm_args.c
parente4385baaa2bfe4c0a6540f4c996df4ccff71cdca (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.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/vm_args.c b/vm_args.c
index 0c1a26cfad..5593f95695 100644
--- a/vm_args.c
+++ b/vm_args.c
@@ -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) {