From aa874216dc47c8b5f8ec17ee3d71b23c0a882fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20=C5=9Awi=C4=85tkowski?= Date: Mon, 14 Jul 2025 15:54:52 +0200 Subject: [PATCH] Optimize checking for valid arguments to avoid O(N*M) complexity --- mrbgems/mruby-struct/src/struct.c | 11 +++++++---- mrbgems/mruby-struct/test/struct.rb | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c index bc14dcd86..3f7c90799 100644 --- a/mrbgems/mruby-struct/src/struct.c +++ b/mrbgems/mruby-struct/src/struct.c @@ -351,15 +351,18 @@ mrb_struct_initialize_withKw(mrb_state *mrb, mrb_value hash, mrb_value self) } } + /* Create a hash of valid members for faster lookup */ + mrb_value members_hash = mrb_hash_new(mrb); + for (mrb_int i = 0; i < RARRAY_LEN(members); i++) { + mrb_hash_set(mrb, members_hash, RARRAY_PTR(members)[i], mrb_true_value()); + } /* Check if all keys in the hash are valid members */ - mrb_value keys = mrb_hash_keys(mrb, hash); mrb_value invalid_keys = mrb_ary_new(mrb); - + mrb_value keys = mrb_hash_keys(mrb, hash); for (mrb_int i = 0; i < RARRAY_LEN(keys); i++) { mrb_value key = RARRAY_PTR(keys)[i]; - mrb_value include_result = mrb_funcall(mrb, members, "include?", 1, key); - if (mrb_test(include_result) == FALSE) { + if (!mrb_hash_key_p(mrb, members_hash, key)) { mrb_ary_push(mrb, invalid_keys, key); } } diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb index a2fbcdc3d..deed70680 100644 --- a/mrbgems/mruby-struct/test/struct.rb +++ b/mrbgems/mruby-struct/test/struct.rb @@ -276,7 +276,7 @@ end assert "Struct initialize when :keyword_init is false" do c = Struct.new(:foo, :bar, keyword_init: false) - + o = c.new(1, 2) assert_equal 1, o.foo assert_equal 2, o.bar