class.c: merge conditional methods into ROM tables

Move conditional mrb_define_method_id() calls into ROM entry
arrays using #ifdef guards. With linear search, sizeof in
MRB_MT_ROM_TAB() adjusts automatically after preprocessing.

Cross-class ROM tables (methods a gem defines on a class it does
not own) are reverted to mrb_define_method_id(). Multiple gems
should not add ROM table layers to the same class; each layer
costs a 16-byte mrb_mt_tbl struct in RAM and deepens the lookup
chain. Use mrb_define_method_id() for cross-class methods.

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2026-02-20 11:05:03 +09:00
parent 8adba34bd9
commit 20b9002214
15 changed files with 74 additions and 135 deletions
+2 -12
View File
@@ -575,16 +575,6 @@ static const mrb_mt_entry complex_rom_entries[] = {
};
static mrb_mt_tbl complex_rom_mt = MRB_MT_ROM_TAB(complex_rom_entries);
static const mrb_mt_entry nil_to_c_rom_entries[] = {
MRB_MT_ENTRY(nil_to_c, MRB_SYM(to_c), MRB_MT_NOARG),
};
static mrb_mt_tbl nil_to_c_rom_mt = MRB_MT_ROM_TAB(nil_to_c_rom_entries);
static const mrb_mt_entry kernel_complex_rom_entries[] = {
MRB_MT_ENTRY(complex_s_rect, MRB_SYM(Complex), MRB_MT_PRIVATE),
};
static mrb_mt_tbl kernel_complex_rom_mt = MRB_MT_ROM_TAB(kernel_complex_rom_entries);
void mrb_mruby_complex_gem_init(mrb_state *mrb)
{
struct RClass *comp;
@@ -598,8 +588,8 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
mrb_define_class_method_id(mrb, comp, MRB_SYM(rect), complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
mrb_mt_init_rom(comp, &complex_rom_mt);
mrb_mt_init_rom(mrb->nil_class, &nil_to_c_rom_mt);
mrb_mt_init_rom(mrb->kernel_module, &kernel_complex_rom_mt);
mrb_define_method_id(mrb, mrb->nil_class, MRB_SYM(to_c), nil_to_c, MRB_ARGS_NONE());
mrb_define_private_method_id(mrb, mrb->kernel_module, MRB_SYM(Complex), complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
}
void