From 5e2a7568e26aa92a7af2b45cef6654eff98cdbf8 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 21 Jun 2025 06:41:20 +0900 Subject: [PATCH] mruby-set: move #replace to Ruby again Since it does only clear() and merge(), there is little use of the C implemented fast path. This change also reduce memory consumption. --- mrbgems/mruby-set/mrblib/set.rb | 14 ++------------ mrbgems/mruby-set/src/set.c | 27 --------------------------- 2 files changed, 2 insertions(+), 39 deletions(-) diff --git a/mrbgems/mruby-set/mrblib/set.rb b/mrbgems/mruby-set/mrblib/set.rb index b36669fb0..56ed9733c 100644 --- a/mrbgems/mruby-set/mrblib/set.rb +++ b/mrbgems/mruby-set/mrblib/set.rb @@ -36,15 +36,8 @@ class Set # @param [Enumerable] enum The enumerable object to replace with # @return [Set] self def replace(enum) - if enum.is_a?(Set) - # Fast path: Call C-implemented function for Set-to-Set replace - __set_replace(enum) - else - # General path: Clear and add each element from the enumerable - clear - __do_with_enum(enum) { |o| add(o) } - self - end + clear + merge(enum) end # Deletes every element that appears in the given enumerable object and @@ -152,7 +145,6 @@ class Set end } seen.delete(set.object_id) - self end @@ -264,12 +256,10 @@ class Set def classify return to_enum :classify unless block_given? h = {} - each { |i| x = yield(i) (h[x] ||= self.class.new).add(i) } - h end diff --git a/mrbgems/mruby-set/src/set.c b/mrbgems/mruby-set/src/set.c index 1199b2979..ead05803d 100644 --- a/mrbgems/mruby-set/src/set.c +++ b/mrbgems/mruby-set/src/set.c @@ -360,32 +360,6 @@ set_delete_p(mrb_state *mrb, mrb_value self) } } -/* - * Core implementation of Set-to-Set replace - * This is an internal method that will be called from Ruby - */ -static mrb_value -set_core_replace(mrb_state *mrb, mrb_value self) -{ - mrb_value other = mrb_get_arg1(mrb); - - /* Clear the current set */ - set_clear(mrb, self); - - khash_t(set) *self_kh = set_get_khash(mrb, self); - if (!self_kh) { - /* If self is empty after clearing, create a new hash */ - self_kh = kh_init(set, mrb); - set_set_khash(mrb, self, self_kh); - } - - /* Add all elements from other set */ - khash_t(set) *other_kh = set_get_khash(mrb, other); - set_copy_elements(mrb, self_kh, other_kh); - - return self; -} - /* * Core implementation of Set-to-Set merge (mutating version) * This is an internal method that will be called from Ruby @@ -924,7 +898,6 @@ mrb_mruby_set_gem_init(mrb_state *mrb) mrb_define_method(mrb, set, "delete", set_delete, MRB_ARGS_REQ(1)); mrb_define_method(mrb, set, "delete?", set_delete_p, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, set, "__set_replace", set_core_replace, MRB_ARGS_REQ(1)); mrb_define_method(mrb, set, "__set_merge", set_core_merge, MRB_ARGS_REQ(1)); mrb_define_method(mrb, set, "__set_subtract", set_core_subtract, MRB_ARGS_REQ(1));