From f46d77dcf00640087e2c39f3d2c24e3058801f65 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 19 Feb 2026 09:39:19 +0900 Subject: [PATCH] mruby-time: ROM method table for Time class Co-authored-by: Claude --- mrbgems/mruby-time/src/time.c | 145 ++++++++++++++++++++++++++++------ 1 file changed, 122 insertions(+), 23 deletions(-) diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c index d554283c8..85b6acdd9 100644 --- a/mrbgems/mruby-time/src/time.c +++ b/mrbgems/mruby-time/src/time.c @@ -1663,30 +1663,133 @@ time_utc_offset(mrb_state *mrb, mrb_value self) return mrb_fixnum_value(offset_seconds); } +/* ---------------------------*/ +#ifndef MRB_NO_PRESYM +#define TIME_ROM_MT_SIZE 46 +static struct { + union mt_ptr vals[TIME_ROM_MT_SIZE]; + mrb_sym keys[TIME_ROM_MT_SIZE]; +} time_rom_data = { + .vals = { + { .func = time_hash }, + { .func = time_eq }, + { .func = time_eq }, + { .func = time_cmp }, + { .func = time_plus }, + { .func = time_minus }, + { .func = time_to_s }, + { .func = time_to_s }, + { .func = time_asctime }, + { .func = time_asctime }, + { .func = time_day }, + { .func = time_dst_p }, + { .func = time_getutc }, + { .func = time_getlocal }, + { .func = time_getutc }, + { .func = time_utc_p }, + { .func = time_utc }, + { .func = time_hour }, + { .func = time_localtime }, + { .func = time_day }, + { .func = time_min }, + { .func = time_mon }, + { .func = time_mon }, + { .func = time_sec }, + { .func = time_to_i }, + { .func = time_usec }, + { .func = time_nsec }, + { .func = time_nsec }, + { .func = time_utc }, + { .func = time_utc_p }, + { .func = time_wday }, + { .func = time_yday }, + { .func = time_year }, + { .func = time_zone }, + { .func = time_init }, + { .func = time_init_copy }, + { .func = time_sunday }, + { .func = time_monday }, + { .func = time_tuesday }, + { .func = time_wednesday }, + { .func = time_thursday }, + { .func = time_friday }, + { .func = time_saturday }, + { .func = time_utc_offset }, + { .func = time_utc_offset }, + { .func = time_utc_offset }, + }, + .keys = { + MT_KEY(MRB_SYM(hash), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(eql), MT_FUNC|MT_PUBLIC), + MT_KEY(MRB_OPSYM(eq), MT_FUNC|MT_PUBLIC), + MT_KEY(MRB_OPSYM(cmp), MT_FUNC|MT_PUBLIC), + MT_KEY(MRB_OPSYM(add), MT_FUNC|MT_PUBLIC), + MT_KEY(MRB_OPSYM(sub), MT_FUNC|MT_PUBLIC), + MT_KEY(MRB_SYM(to_s), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(inspect), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(asctime), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(ctime), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(day), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(dst), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(getgm), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(getlocal), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(getutc), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(gmt), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(gmtime), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(hour), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(localtime), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(mday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(min), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(mon), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(month), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(sec), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(to_i), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(usec), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(nsec), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(tv_nsec), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(utc), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(utc), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(wday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(yday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(year), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(zone), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(initialize), MT_FUNC|MT_PRIVATE), + MT_KEY(MRB_SYM(initialize_copy), MT_FUNC|MT_PRIVATE), + MT_KEY(MRB_SYM_Q(sunday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(monday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(tuesday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(wednesday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(thursday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(friday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM_Q(saturday), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(gmt_offset), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(gmtoff), MT_FUNC|MT_NOARG|MT_PUBLIC), + MT_KEY(MRB_SYM(utc_offset), MT_FUNC|MT_NOARG|MT_PUBLIC), + } +}; +static mt_tbl time_rom_mt = { + TIME_ROM_MT_SIZE, TIME_ROM_MT_SIZE, + (union mt_ptr*)&time_rom_data, NULL +}; +#endif /* !MRB_NO_PRESYM */ + void mrb_mruby_time_gem_init(mrb_state* mrb) { - /* - * Initializes the Time class in the mruby state. - * - Defines the Time class (ISO 15.2.19.2). - * - Sets its instance type to MRB_TT_CDATA, meaning instances carry a C data pointer. - * - Includes the Comparable module. - * - Defines class methods (e.g., Time.at, Time.now, Time.gm, Time.local). - * - Defines instance methods (e.g., +, -, <=>, to_s, year, month, day, etc.). - * Many instance methods are aliased (e.g., day and mday). - * Ruby standard library method references (e.g., 15.2.19.6.1) are from an older ISO Ruby spec. - */ /* ISO 15.2.19.2 */ struct RClass *tc = mrb_define_class_id(mrb, MRB_SYM(Time), mrb->object_class); - MRB_SET_INSTANCE_TT(tc, MRB_TT_CDATA); /* Time instances will hold a C pointer (struct mrb_time) */ - mrb_include_module(mrb, tc, mrb_module_get_id(mrb, MRB_SYM(Comparable))); /* Include Comparable module */ + MRB_SET_INSTANCE_TT(tc, MRB_TT_CDATA); + mrb_include_module(mrb, tc, mrb_module_get_id(mrb, MRB_SYM(Comparable))); mrb_define_class_method_id(mrb, tc, MRB_SYM(at), time_at_m, MRB_ARGS_ARG(1, 1)); /* 15.2.19.6.1 */ mrb_define_class_method_id(mrb, tc, MRB_SYM(gm), time_gm, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.2 */ - mrb_define_class_method_id(mrb, tc, MRB_SYM(local), time_local, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.3 */ - mrb_define_class_method_id(mrb, tc, MRB_SYM(mktime), time_local, MRB_ARGS_ARG(1,6));/* 15.2.19.6.4 */ - mrb_define_class_method_id(mrb, tc, MRB_SYM(now), time_now, MRB_ARGS_NONE()); /* 15.2.19.6.5 */ + mrb_define_class_method_id(mrb, tc, MRB_SYM(local), time_local, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.3 */ + mrb_define_class_method_id(mrb, tc, MRB_SYM(mktime), time_local, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.4 */ + mrb_define_class_method_id(mrb, tc, MRB_SYM(now), time_now, MRB_ARGS_NONE()); /* 15.2.19.6.5 */ mrb_define_class_method_id(mrb, tc, MRB_SYM(utc), time_gm, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.6 */ +#ifndef MRB_NO_PRESYM + mrb_mt_init_rom(tc, &time_rom_mt); +#else mrb_define_method_id(mrb, tc, MRB_SYM(hash), time_hash , MRB_ARGS_NONE()); mrb_define_method_id(mrb, tc, MRB_SYM_Q(eql), time_eq , MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, tc, MRB_OPSYM(eq), time_eq , MRB_ARGS_REQ(1)); @@ -1708,15 +1811,10 @@ mrb_mruby_time_gem_init(mrb_state* mrb) mrb_define_method_id(mrb, tc, MRB_SYM(localtime), time_localtime, MRB_ARGS_NONE()); /* 15.2.19.7.18 */ mrb_define_method_id(mrb, tc, MRB_SYM(mday), time_day, MRB_ARGS_NONE()); /* 15.2.19.7.19 */ mrb_define_method_id(mrb, tc, MRB_SYM(min), time_min, MRB_ARGS_NONE()); /* 15.2.19.7.20 */ - mrb_define_method_id(mrb, tc, MRB_SYM(mon), time_mon, MRB_ARGS_NONE()); /* 15.2.19.7.21 */ mrb_define_method_id(mrb, tc, MRB_SYM(month), time_mon, MRB_ARGS_NONE()); /* 15.2.19.7.22 */ - mrb_define_method_id(mrb, tc, MRB_SYM(sec), time_sec, MRB_ARGS_NONE()); /* 15.2.19.7.23 */ mrb_define_method_id(mrb, tc, MRB_SYM(to_i), time_to_i, MRB_ARGS_NONE()); /* 15.2.19.7.25 */ -#ifndef MRB_NO_FLOAT - mrb_define_method_id(mrb, tc, MRB_SYM(to_f), time_to_f, MRB_ARGS_NONE()); /* 15.2.19.7.24 */ -#endif mrb_define_method_id(mrb, tc, MRB_SYM(usec), time_usec, MRB_ARGS_NONE()); /* 15.2.19.7.26 */ mrb_define_method_id(mrb, tc, MRB_SYM(nsec), time_nsec, MRB_ARGS_NONE()); mrb_define_method_id(mrb, tc, MRB_SYM(tv_nsec), time_nsec, MRB_ARGS_NONE()); @@ -1726,10 +1824,8 @@ mrb_mruby_time_gem_init(mrb_state* mrb) mrb_define_method_id(mrb, tc, MRB_SYM(yday), time_yday, MRB_ARGS_NONE()); /* 15.2.19.7.31 */ mrb_define_method_id(mrb, tc, MRB_SYM(year), time_year, MRB_ARGS_NONE()); /* 15.2.19.7.32 */ mrb_define_method_id(mrb, tc, MRB_SYM(zone), time_zone, MRB_ARGS_NONE()); /* 15.2.19.7.33 */ - mrb_define_method_id(mrb, tc, MRB_SYM(initialize), time_init, MRB_ARGS_REQ(1)); /* 15.2.19.7.16 */ mrb_define_private_method_id(mrb, tc, MRB_SYM(initialize_copy), time_init_copy, MRB_ARGS_REQ(1)); /* 15.2.19.7.17 */ - mrb_define_method_id(mrb, tc, MRB_SYM_Q(sunday), time_sunday, MRB_ARGS_NONE()); mrb_define_method_id(mrb, tc, MRB_SYM_Q(monday), time_monday, MRB_ARGS_NONE()); mrb_define_method_id(mrb, tc, MRB_SYM_Q(tuesday), time_tuesday, MRB_ARGS_NONE()); @@ -1737,10 +1833,13 @@ mrb_mruby_time_gem_init(mrb_state* mrb) mrb_define_method_id(mrb, tc, MRB_SYM_Q(thursday), time_thursday, MRB_ARGS_NONE()); mrb_define_method_id(mrb, tc, MRB_SYM_Q(friday), time_friday, MRB_ARGS_NONE()); mrb_define_method_id(mrb, tc, MRB_SYM_Q(saturday), time_saturday, MRB_ARGS_NONE()); - mrb_define_method_id(mrb, tc, MRB_SYM(gmt_offset), time_utc_offset, MRB_ARGS_NONE()); /* 15.2.19.7.12 */ mrb_define_method_id(mrb, tc, MRB_SYM(gmtoff), time_utc_offset, MRB_ARGS_NONE()); /* 15.2.19.7.14 */ mrb_define_method_id(mrb, tc, MRB_SYM(utc_offset), time_utc_offset, MRB_ARGS_NONE()); /* 15.2.19.7.29 */ +#endif +#ifndef MRB_NO_FLOAT + mrb_define_method_id(mrb, tc, MRB_SYM(to_f), time_to_f, MRB_ARGS_NONE()); /* 15.2.19.7.24 */ +#endif } void