From: "Eregon (Benoit Daloze) via ruby-core" Date: 2025-07-01T17:27:40+00:00 Subject: [ruby-core:122641] [Ruby Feature#21459] Add Set C-API Issue #21459 has been updated by Eregon (Benoit Daloze). > If you want to pass returned objects to other C-API functions, you need defensive type checks, or it can result in undefined behavior (including segfaults) depending on how the returned objects are used. I was thinking about methods returning a Set, those are no risk for using `rb_funcall()` on it. In fact these direct C API functions without type checks is what causes the issue in the first place. > Let's say you want to call the Set#size method and pass the result to rb_fix2str. They could just use `rb_funcall(returned_value, "to_s")` on the result then, but yeah it would be a problem for `FIX2LONG(returned_value)`, fair point. > Having C-API functions for common methods is more efficient performance wise, and increases programmer happiness, since calling the functions is simpler than using rb_funcall. I wouldn't say it increases programmer happiness in general, this is only relevant for native extensions using `Set` and e.g. needing to iterate a Set, that's quite a small fraction of native extensions. > This is especially true in the rb_set_foreach case. This convinces me, good point, I'm fine with adding the C API functions proposed here. > The idea that we shouldn't add this because it cannot be used on older Ruby versions is basically an argument against adding any feature at all. I'm just highlighting that the utility/value of this will be very low until gems can assume 3.5+ and only relevant for gems using native extensions using Set. But still useful for those, yes. ---------------------------------------- Feature #21459: Add Set C-API https://bugs.ruby-lang.org/issues/21459#change-113913 * Author: jeremyevans0 (Jeremy Evans) * Status: Open ---------------------------------------- I would like to add a minimal C-API for Set: ```c void rb_set_foreach(VALUE set, int (*func)(VALUE element, VALUE arg), VALUE arg); VALUE rb_set_new(void); VALUE rb_set_new_capa(unsigned long capa); bool rb_set_lookup(VALUE set, VALUE element); bool rb_set_add(VALUE set, VALUE element); VALUE rb_set_clear(VALUE set); bool rb_set_delete(VALUE set, VALUE element); size_t rb_set_size(VALUE set); ``` I think this should allow extension libraries to start benefiting from core Set without having to resort to method calls (dangerous in an C extension as they could be redefined to return objects of an unexpected type). I've submitted a pull request for this: https://github.com/ruby/ruby/pull/13735 -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/