From b86c220384b1bd6c08f41baaf0d76e3b3021f9a5 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 2 Feb 2025 21:02:03 +0900 Subject: [PATCH] =?UTF-8?q?Avoid=20array=20object=20creation=20with=20?= =?UTF-8?q?=E2=80=9Cunknown=20keyword=E2=80=9D=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is sufficient to return the first element. --- include/mruby/internal.h | 1 + src/class.c | 3 +-- src/hash.c | 9 +++++++++ src/vm.c | 3 +-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/mruby/internal.h b/include/mruby/internal.h index 1c50ebb9c..b8387b303 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -81,6 +81,7 @@ void mrb_gc_free_mt(mrb_state*, struct RClass*); size_t mrb_hash_memsize(mrb_value obj); size_t mrb_gc_mark_hash(mrb_state*, struct RHash*); void mrb_gc_free_hash(mrb_state*, struct RHash*); +mrb_value mrb_hash_first_key(mrb_state*, mrb_value); /* irep */ struct mrb_insn_data mrb_decode_insn(const mrb_code *pc); diff --git a/src/class.c b/src/class.c index 212732478..404bb99dc 100644 --- a/src/class.c +++ b/src/class.c @@ -1284,8 +1284,7 @@ get_args_v(mrb_state *mrb, mrb_args_format format, void** ptr, va_list *ap) *rest = ksrc; } else if (!mrb_hash_empty_p(mrb, ksrc)) { - ksrc = mrb_hash_keys(mrb, ksrc); - ksrc = RARRAY_PTR(ksrc)[0]; + ksrc = mrb_hash_first_key(mrb, ksrc); mrb_raisef(mrb, E_ARGUMENT_ERROR, "unknown keyword: %v", ksrc); } } diff --git a/src/hash.c b/src/hash.c index 542b1e883..641e036b5 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1130,6 +1130,15 @@ mrb_hash_foreach(mrb_state *mrb, struct RHash *h, mrb_hash_foreach_func *func, v } } +mrb_value +mrb_hash_first_key(mrb_state *mrb, mrb_value h) +{ + H_EACH(mrb_hash_ptr(h), entry) { + return entry->key; + } + return mrb_nil_value(); +} + MRB_API mrb_value mrb_hash_new(mrb_state *mrb) { diff --git a/src/vm.c b/src/vm.c index 824358d19..97ee579ea 100644 --- a/src/vm.c +++ b/src/vm.c @@ -2276,8 +2276,7 @@ RETRY_TRY_BLOCK: mrb_value kdict; if (kidx >= 0 && mrb_hash_p(kdict=regs[kidx]) && !mrb_hash_empty_p(mrb, kdict)) { - mrb_value keys = mrb_hash_keys(mrb, kdict); - mrb_value key1 = RARRAY_PTR(keys)[0]; + mrb_value key1 = mrb_hash_first_key(mrb, kdict); RAISE_FORMAT(mrb, E_ARGUMENT_ERROR, "unknown keyword: %v", key1); } NEXT;