зеркало из https://github.com/github/ruby.git
Fetch the last element only when not empty
Also `flag_keyword_hash` sets to 0 or a hash object.
This commit is contained in:
Родитель
0dc0c24cad
Коммит
48f0352280
12
vm_args.c
12
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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче