From 2c2e38cceb4893dacb1f7bbb1cd26f632739c48b Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 18 Feb 2026 16:30:53 +0900 Subject: [PATCH] proc.c: ROM method table for Proc class (5 methods) Co-authored-by: Claude --- src/proc.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/proc.c b/src/proc.c index a9c4d8f0d..39306f306 100644 --- a/src/proc.c +++ b/src/proc.c @@ -544,6 +544,34 @@ mrb_proc_merge_lvar(mrb_state *mrb, mrb_irep *irep, struct REnv *env, int num, c MRB_ENV_SET_LEN(env, irep->nlocals); } +/* ---------------------------*/ +#ifndef MRB_NO_PRESYM +#define PROC_ROM_MT_SIZE 5 +static struct { + union mt_ptr vals[PROC_ROM_MT_SIZE]; + mrb_sym keys[PROC_ROM_MT_SIZE]; +} proc_rom_data = { + .vals = { + { .func = mrb_proc_init_copy }, + { .func = proc_arity }, + { .func = proc_eql }, + { .func = proc_eql }, + { .func = proc_hash }, + }, + .keys = { + MT_KEY(MRB_SYM(initialize_copy), MT_FUNC|MT_PRIVATE), + MT_KEY(MRB_SYM(arity), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_OPSYM(eq), MT_FUNC|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(eql), MT_FUNC|MT_PUBLIC), + MT_KEY(MRB_SYM(hash), MT_FUNC|MT_NOARG|MT_PUBLIC), + } +}; +static mt_tbl proc_rom_mt = { + PROC_ROM_MT_SIZE, PROC_ROM_MT_SIZE, + (union mt_ptr*)&proc_rom_data, NULL +}; +#endif /* !MRB_NO_PRESYM */ + void mrb_init_proc(mrb_state *mrb) { @@ -553,11 +581,15 @@ mrb_init_proc(mrb_state *mrb) MRB_SET_INSTANCE_TT(pc, MRB_TT_PROC); MRB_UNDEF_ALLOCATOR(pc); mrb_define_class_method_id(mrb, pc, MRB_SYM(new), mrb_proc_s_new, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); +#ifndef MRB_NO_PRESYM + mrb_mt_init_rom(pc, &proc_rom_mt); +#else mrb_define_private_method_id(mrb, pc, MRB_SYM(initialize_copy), mrb_proc_init_copy, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, pc, MRB_SYM(arity), proc_arity, MRB_ARGS_NONE()); /* 15.2.17.4.2 */ mrb_define_method_id(mrb, pc, MRB_OPSYM(eq), proc_eql, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, pc, MRB_SYM_Q(eql), proc_eql, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, pc, MRB_SYM(hash), proc_hash, MRB_ARGS_NONE()); /* 15.2.17.4.2 */ +#endif MRB_METHOD_FROM_PROC(m, &call_proc); mrb_define_method_raw(mrb, pc, MRB_SYM(call), m); /* 15.2.17.4.3 */