mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
mruby-object-ext: ROM method tables for NilClass/Kernel/BasicObject extensions (5 methods)
Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user