diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-03-17 18:54:49 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-03-17 20:53:41 +0900 |
commit | e660b934b98943826f888f2b73f773c6411cd199 (patch) | |
tree | 0abbca3c07d10cc1c9a2ea2ac0e4524a194d5e33 /struct.c | |
parent | e9553a8cac633067e0da08d78e2200944d33bfdd (diff) |
A positional Hash is not keyword arguments [Bug #18632]
Diffstat (limited to 'struct.c')
-rw-r--r-- | struct.c | 8 |
1 files changed, 4 insertions, 4 deletions
@@ -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(); |