diff --git a/mrbgems/mruby-numeric-ext/src/numeric_ext.c b/mrbgems/mruby-numeric-ext/src/numeric_ext.c index a29f0a4bd..6321a81eb 100644 --- a/mrbgems/mruby-numeric-ext/src/numeric_ext.c +++ b/mrbgems/mruby-numeric-ext/src/numeric_ext.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -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