class.c: ROM method tables for BasicObject/Module/Class (49 methods)

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2026-02-18 16:30:43 +09:00
parent cdbc18cf76
commit 8fdd5757e3
+160 -3
View File
@@ -4364,6 +4364,152 @@ static const struct RProc neq_proc = {
{ &neq_irep }, NULL, { NULL }
};
/* ---------------------------*/
#ifndef MRB_NO_PRESYM
#define BOB_ROM_MT_SIZE 11
static struct {
union mt_ptr vals[BOB_ROM_MT_SIZE];
mrb_sym keys[BOB_ROM_MT_SIZE];
} bob_rom_data = {
.vals = {
{ .func = mrb_obj_equal_m },
{ .func = mrb_bob_not },
{ .func = mrb_obj_id_m },
{ .func = mrb_f_send },
{ .func = mrb_obj_equal_m },
{ .func = mrb_do_nothing },
{ .func = mrb_obj_instance_eval },
{ .func = mrb_obj_missing },
{ .func = mrb_do_nothing },
{ .func = mrb_do_nothing },
{ .func = mrb_do_nothing },
},
.keys = {
MT_KEY(MRB_OPSYM(eq), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_OPSYM(not), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(__id__), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(__send__), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM_Q(equal), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(initialize), MT_FUNC|MT_NOARG|MT_PRIVATE),
MT_KEY(MRB_SYM(instance_eval), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(method_missing), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(singleton_method_added), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(singleton_method_removed), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(singleton_method_undefined), MT_FUNC|MT_PRIVATE),
}
};
static mt_tbl bob_rom_mt = {
BOB_ROM_MT_SIZE, BOB_ROM_MT_SIZE,
(union mt_ptr*)&bob_rom_data, NULL
};
#define CLS_ROM_MT_SIZE 4
static struct {
union mt_ptr vals[CLS_ROM_MT_SIZE];
mrb_sym keys[CLS_ROM_MT_SIZE];
} cls_rom_data = {
.vals = {
{ .func = mrb_instance_alloc },
{ .func = mrb_do_nothing },
{ .func = mrb_class_initialize },
{ .func = mrb_class_superclass },
},
.keys = {
MT_KEY(MRB_SYM(allocate), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(inherited), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(initialize), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(superclass), MT_FUNC|MT_NOARG|MT_PUBLIC),
}
};
static mt_tbl cls_rom_mt = {
CLS_ROM_MT_SIZE, CLS_ROM_MT_SIZE,
(union mt_ptr*)&cls_rom_data, NULL
};
#define MOD_ROM_MT_SIZE 34
static struct {
union mt_ptr vals[MOD_ROM_MT_SIZE];
mrb_sym keys[MOD_ROM_MT_SIZE];
} mod_rom_data = {
.vals = {
{ .func = mrb_mod_eqq },
{ .func = mrb_mod_alias },
{ .func = mrb_mod_ancestors },
{ .func = mrb_mod_attr_accessor },
{ .func = mrb_mod_attr_reader },
{ .func = mrb_mod_attr_writer },
{ .func = mrb_mod_module_eval },
{ .func = mrb_do_nothing },
{ .func = mrb_mod_const_defined },
{ .func = mrb_mod_const_get },
{ .func = mrb_mod_const_missing },
{ .func = mrb_mod_const_set },
{ .func = mod_define_method },
{ .func = mrb_mod_dup },
{ .func = mrb_do_nothing },
{ .func = mrb_mod_include },
{ .func = mrb_mod_include_p },
{ .func = mrb_do_nothing },
{ .func = mrb_mod_initialize },
{ .func = mrb_mod_to_s },
{ .func = mrb_do_nothing },
{ .func = mrb_do_nothing },
{ .func = mrb_mod_method_defined },
{ .func = mrb_do_nothing },
{ .func = mrb_mod_module_eval },
{ .func = mrb_mod_module_function },
{ .func = mrb_mod_prepend },
{ .func = mrb_do_nothing },
{ .func = mrb_mod_private },
{ .func = mrb_mod_protected },
{ .func = mrb_mod_public },
{ .func = mrb_mod_remove_const },
{ .func = mrb_mod_to_s },
{ .func = mrb_mod_undef },
},
.keys = {
MT_KEY(MRB_OPSYM(eqq), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(alias_method), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(ancestors), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(attr_accessor), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(attr_reader), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(attr_writer), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(class_eval), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(const_added), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM_Q(const_defined), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(const_get), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(const_missing), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(const_set), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(define_method), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(dup), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(extended), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(include), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM_Q(include), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(included), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(initialize), MT_FUNC|MT_NOARG|MT_PRIVATE),
MT_KEY(MRB_SYM(inspect), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(method_added), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(method_removed), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM_Q(method_defined), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(method_undefined), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(module_eval), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(module_function), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(prepend), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(prepended), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(private), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(protected), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(public), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(remove_const), MT_FUNC|MT_PRIVATE),
MT_KEY(MRB_SYM(to_s), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(undef_method), MT_FUNC|MT_PUBLIC),
}
};
static mt_tbl mod_rom_mt = {
MOD_ROM_MT_SIZE, MOD_ROM_MT_SIZE,
(union mt_ptr*)&mod_rom_data, NULL
};
#endif /* !MRB_NO_PRESYM */
void
mrb_init_class(mrb_state *mrb)
{
@@ -4397,6 +4543,9 @@ mrb_init_class(mrb_state *mrb)
mrb_class_name_class(mrb, NULL, mod, MRB_SYM(Module)); /* 15.2.2 */
mrb_class_name_class(mrb, NULL, cls, MRB_SYM(Class)); /* 15.2.3 */
#ifndef MRB_NO_PRESYM
mrb_mt_init_rom(bob, &bob_rom_mt);
#else
mrb_define_method_id(mrb, bob, MRB_SYM(initialize), mrb_do_nothing, MRB_ARGS_NONE());
mrb_define_method_id(mrb, bob, MRB_OPSYM(not), mrb_bob_not, MRB_ARGS_NONE());
mrb_define_method_id(mrb, bob, MRB_OPSYM(eq), mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */
@@ -4408,25 +4557,32 @@ mrb_init_class(mrb_state *mrb)
mrb_define_private_method_id(mrb, bob, MRB_SYM(singleton_method_removed),mrb_do_nothing, MRB_ARGS_REQ(1));
mrb_define_private_method_id(mrb, bob, MRB_SYM(singleton_method_undefined),mrb_do_nothing, MRB_ARGS_REQ(1));
mrb_define_private_method_id(mrb, bob, MRB_SYM(method_missing), mrb_obj_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */
#endif
mrb_method_t m;
MRB_METHOD_FROM_PROC(m, &neq_proc);
mrb_define_method_raw(mrb, bob, MRB_OPSYM(neq), m);
mrb_define_class_method_id(mrb, cls, MRB_SYM(new), mrb_class_new_class, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK());
#ifndef MRB_NO_PRESYM
mrb_mt_init_rom(cls, &cls_rom_mt);
#else
mrb_define_method_id(mrb, cls, MRB_SYM(allocate), mrb_instance_alloc, MRB_ARGS_NONE());
mrb_define_method_id(mrb, cls, MRB_SYM(superclass), mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */
mrb_define_method_id(mrb, cls, MRB_SYM(initialize), mrb_class_initialize, MRB_ARGS_OPT(1)); /* 15.2.3.3.1 */
mrb_define_private_method_id(mrb, cls, MRB_SYM(inherited), mrb_do_nothing, MRB_ARGS_REQ(1));
#endif
init_class_new(mrb, cls);
#ifndef MRB_NO_PRESYM
mrb_mt_init_rom(mod, &mod_rom_mt);
#else
mrb_define_private_method_id(mrb, mod, MRB_SYM(extended), mrb_do_nothing, MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */
mrb_define_private_method_id(mrb, mod, MRB_SYM(prepended), mrb_do_nothing, MRB_ARGS_REQ(1));
mrb_define_method_id(mrb, mod, MRB_SYM_Q(include), mrb_mod_include_p, MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */
mrb_define_method_id(mrb, mod, MRB_SYM(include), mrb_mod_include, MRB_ARGS_REQ(1)); /* 15.2.2.4.27 */
mrb_define_method_id(mrb, mod, MRB_SYM(prepend), mrb_mod_prepend, MRB_ARGS_REQ(1));
mrb_define_method_id(mrb, mod, MRB_SYM(prepend), mrb_mod_prepend, MRB_ARGS_REQ(1));
mrb_define_method_id(mrb, mod, MRB_SYM(class_eval), mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.15 */
mrb_define_private_method_id(mrb, mod, MRB_SYM(included), mrb_do_nothing, MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */
mrb_define_method_id(mrb, mod, MRB_SYM(initialize), mrb_mod_initialize, MRB_ARGS_NONE()); /* 15.2.2.4.31 */
@@ -4438,7 +4594,6 @@ mrb_init_class(mrb_state *mrb)
mrb_define_method_id(mrb, mod, MRB_SYM(attr_accessor), mrb_mod_attr_accessor, MRB_ARGS_ANY()); /* 15.2.2.4.12 */
mrb_define_method_id(mrb, mod, MRB_SYM(attr_reader), mrb_mod_attr_reader, MRB_ARGS_ANY()); /* 15.2.2.4.13 */
mrb_define_method_id(mrb, mod, MRB_SYM(attr_writer), mrb_mod_attr_writer, MRB_ARGS_ANY()); /* 15.2.2.4.14 */
mrb_define_alias_id(mrb, mod, MRB_SYM(attr), MRB_SYM(attr_reader)); /* 15.2.2.4.11 */
mrb_define_method_id(mrb, mod, MRB_SYM(to_s), mrb_mod_to_s, MRB_ARGS_NONE());
mrb_define_method_id(mrb, mod, MRB_SYM(inspect), mrb_mod_to_s, MRB_ARGS_NONE());
mrb_define_method_id(mrb, mod, MRB_SYM(alias_method), mrb_mod_alias, MRB_ARGS_ANY()); /* 15.2.2.4.8 */
@@ -4457,6 +4612,8 @@ mrb_init_class(mrb_state *mrb)
mrb_define_private_method_id(mrb, mod, MRB_SYM(method_removed), mrb_do_nothing, MRB_ARGS_REQ(1));
mrb_define_private_method_id(mrb, mod, MRB_SYM(method_undefined), mrb_do_nothing, MRB_ARGS_REQ(1));
mrb_define_private_method_id(mrb, mod, MRB_SYM(const_added), mrb_do_nothing, MRB_ARGS_REQ(1));
#endif
mrb_define_alias_id(mrb, mod, MRB_SYM(attr), MRB_SYM(attr_reader)); /* 15.2.2.4.11 */
mrb_undef_method_id(mrb, cls, MRB_SYM(module_function));