mruby-numeric-ext: ROM method table for Integer extensions (9 methods)

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2026-02-18 16:44:25 +09:00
parent 0ac01f23ba
commit b52d3936e6
+40 -1
View File
@@ -2,6 +2,7 @@
#include <mruby/numeric.h>
#include <mruby/array.h>
#include <mruby/string.h>
#include <mruby/class.h>
#include <mruby/internal.h>
#include <mruby/presym.h>
@@ -479,14 +480,51 @@ int_sqrt(mrb_state *mrb, mrb_value self)
}
}
#ifndef MRB_NO_PRESYM
#define INTEGER_EXT_ROM_MT_SIZE 9
static struct {
union mt_ptr vals[INTEGER_EXT_ROM_MT_SIZE];
mrb_sym keys[INTEGER_EXT_ROM_MT_SIZE];
} integer_ext_rom_data = {
.vals = {
{ .func = int_remainder },
{ .func = int_powm },
{ .func = int_digits },
{ .func = int_size },
{ .func = int_bit_length },
{ .func = int_odd },
{ .func = int_even },
{ .func = int_gcd },
{ .func = int_lcm },
},
.keys = {
MT_KEY(MRB_SYM(remainder), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(pow), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(digits), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(size), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(bit_length), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM_Q(odd), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM_Q(even), MT_FUNC|MT_NOARG|MT_PUBLIC),
MT_KEY(MRB_SYM(gcd), MT_FUNC|MT_PUBLIC),
MT_KEY(MRB_SYM(lcm), MT_FUNC|MT_PUBLIC),
}
};
static mt_tbl integer_ext_rom_mt = {
INTEGER_EXT_ROM_MT_SIZE, INTEGER_EXT_ROM_MT_SIZE,
(union mt_ptr*)&integer_ext_rom_data, NULL
};
#endif /* !MRB_NO_PRESYM */
void
mrb_mruby_numeric_ext_gem_init(mrb_state* mrb)
{
struct RClass *ic = mrb->integer_class;
mrb_define_alias_id(mrb, ic, MRB_SYM(modulo), MRB_OPSYM(mod));
#ifndef MRB_NO_PRESYM
mrb_mt_init_rom(ic, &integer_ext_rom_mt);
#else
mrb_define_method_id(mrb, ic, MRB_SYM(remainder), int_remainder, MRB_ARGS_REQ(1));
mrb_define_method_id(mrb, ic, MRB_SYM(pow), int_powm, MRB_ARGS_ARG(1,1));
mrb_define_method_id(mrb, ic, MRB_SYM(digits), int_digits, MRB_ARGS_OPT(1));
mrb_define_method_id(mrb, ic, MRB_SYM(size), int_size, MRB_ARGS_NONE());
@@ -495,6 +533,7 @@ mrb_mruby_numeric_ext_gem_init(mrb_state* mrb)
mrb_define_method_id(mrb, ic, MRB_SYM_Q(even), int_even, MRB_ARGS_NONE());
mrb_define_method_id(mrb, ic, MRB_SYM(gcd), int_gcd, MRB_ARGS_REQ(1));
mrb_define_method_id(mrb, ic, MRB_SYM(lcm), int_lcm, MRB_ARGS_REQ(1));
#endif
mrb_define_class_method_id(mrb, ic, MRB_SYM(sqrt), int_sqrt, MRB_ARGS_REQ(1));
#ifndef MRB_NO_FLOAT