summaryrefslogtreecommitdiff
path: root/struct.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-03-17 18:54:49 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-03-17 20:53:41 +0900
commite660b934b98943826f888f2b73f773c6411cd199 (patch)
tree0abbca3c07d10cc1c9a2ea2ac0e4524a194d5e33 /struct.c
parente9553a8cac633067e0da08d78e2200944d33bfdd (diff)
downloadruby-e660b934b98943826f888f2b73f773c6411cd199.tar.gz
A positional Hash is not keyword arguments [Bug #18632]
Diffstat (limited to 'struct.c')
-rw-r--r--struct.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/struct.c b/struct.c
index 8b19266e62..3610ecfc10 100644
--- a/struct.c
+++ b/struct.c
@@ -576,8 +576,9 @@ rb_struct_s_def(int argc, VALUE *argv, VALUE klass)
long i;
VALUE st;
st_table *tbl;
+ VALUE opt;
- rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
+ argc = rb_scan_args(argc, argv, "1*:", NULL, NULL, &opt);
name = argv[0];
if (SYMBOL_P(name)) {
name = Qnil;
@@ -587,20 +588,19 @@ rb_struct_s_def(int argc, VALUE *argv, VALUE klass)
++argv;
}
- if (RB_TYPE_P(argv[argc-1], T_HASH)) {
+ if (!NIL_P(opt)) {
static ID keyword_ids[1];
if (!keyword_ids[0]) {
keyword_ids[0] = rb_intern("keyword_init");
}
- rb_get_kwargs(argv[argc-1], keyword_ids, 0, 1, &keyword_init);
+ rb_get_kwargs(opt, keyword_ids, 0, 1, &keyword_init);
if (keyword_init == Qundef) {
keyword_init = Qnil;
}
else if (RTEST(keyword_init)) {
keyword_init = Qtrue;
}
- --argc;
}
rest = rb_ident_hash_new();