From 63df017ff6150e5aa4988023e201e5617e9cf90a Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 18 Feb 2026 16:44:27 +0900 Subject: [PATCH] mruby-object-ext: ROM method tables for NilClass/Kernel/BasicObject extensions (5 methods) Co-authored-by: Claude --- mrbgems/mruby-object-ext/src/object.c | 73 ++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c index 0aeba480e..31cf6e7fd 100644 --- a/mrbgems/mruby-object-ext/src/object.c +++ b/mrbgems/mruby-object-ext/src/object.c @@ -97,21 +97,90 @@ obj_instance_exec(mrb_state *mrb, mrb_value self) return mrb_object_exec(mrb, self, mrb_singleton_class_ptr(mrb, self)); } +#ifndef MRB_NO_PRESYM +#define NIL_EXT_ROM_MT_SIZE 3 +static struct { + union mt_ptr vals[NIL_EXT_ROM_MT_SIZE]; + mrb_sym keys[NIL_EXT_ROM_MT_SIZE]; +} nil_ext_rom_data = { + .vals = { + { .func = nil_to_a }, + { .func = nil_to_h }, + { .func = nil_to_i }, + }, + .keys = { + MT_KEY(MRB_SYM(to_a), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(to_h), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(to_i), MT_FUNC|MT_NOARG|MT_PUBLIC), + } +}; +static mt_tbl nil_ext_rom_mt = { + NIL_EXT_ROM_MT_SIZE, NIL_EXT_ROM_MT_SIZE, + (union mt_ptr*)&nil_ext_rom_data, NULL +}; + +#define KERNEL_EXT_ROM_MT_SIZE 1 +static struct { + union mt_ptr vals[KERNEL_EXT_ROM_MT_SIZE]; + mrb_sym keys[KERNEL_EXT_ROM_MT_SIZE]; +} kernel_ext_rom_data = { + .vals = { + { .func = mrb_obj_itself }, + }, + .keys = { + MT_KEY(MRB_SYM(itself), MT_FUNC|MT_NOARG|MT_PUBLIC), + } +}; +static mt_tbl kernel_ext_rom_mt = { + KERNEL_EXT_ROM_MT_SIZE, KERNEL_EXT_ROM_MT_SIZE, + (union mt_ptr*)&kernel_ext_rom_data, NULL +}; + +#define BOB_EXT_ROM_MT_SIZE 1 +static struct { + union mt_ptr vals[BOB_EXT_ROM_MT_SIZE]; + mrb_sym keys[BOB_EXT_ROM_MT_SIZE]; +} bob_ext_rom_data = { + .vals = { + { .func = obj_instance_exec }, + }, + .keys = { + MT_KEY(MRB_SYM(instance_exec), MT_FUNC|MT_PUBLIC), + } +}; +static mt_tbl bob_ext_rom_mt = { + BOB_EXT_ROM_MT_SIZE, BOB_EXT_ROM_MT_SIZE, + (union mt_ptr*)&bob_ext_rom_data, NULL +}; +#endif /* !MRB_NO_PRESYM */ + void mrb_mruby_object_ext_gem_init(mrb_state* mrb) { struct RClass * n = mrb->nil_class; +#ifndef MRB_NO_PRESYM + mrb_mt_init_rom(n, &nil_ext_rom_mt); +#else mrb_define_method_id(mrb, n, MRB_SYM(to_a), nil_to_a, MRB_ARGS_NONE()); + mrb_define_method_id(mrb, n, MRB_SYM(to_h), nil_to_h, MRB_ARGS_NONE()); + mrb_define_method_id(mrb, n, MRB_SYM(to_i), nil_to_i, MRB_ARGS_NONE()); +#endif #ifndef MRB_NO_FLOAT mrb_define_method_id(mrb, n, MRB_SYM(to_f), nil_to_f, MRB_ARGS_NONE()); #endif - mrb_define_method_id(mrb, n, MRB_SYM(to_h), nil_to_h, MRB_ARGS_NONE()); - mrb_define_method_id(mrb, n, MRB_SYM(to_i), nil_to_i, MRB_ARGS_NONE()); +#ifndef MRB_NO_PRESYM + mrb_mt_init_rom(mrb->kernel_module, &kernel_ext_rom_mt); +#else mrb_define_method_id(mrb, mrb->kernel_module, MRB_SYM(itself), mrb_obj_itself, MRB_ARGS_NONE()); +#endif +#ifndef MRB_NO_PRESYM + mrb_mt_init_rom(mrb_class_get_id(mrb, MRB_SYM(BasicObject)), &bob_ext_rom_mt); +#else mrb_define_method_id(mrb, mrb_class_get_id(mrb, MRB_SYM(BasicObject)), MRB_SYM(instance_exec), obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK()); +#endif } void