diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-05-18 11:23:59 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-05-18 11:23:59 +0900 |
| commit | bd7328f5e606a59db25c6c17534f7db6c21fc13c (patch) | |
| tree | f68948454a87bb3bce9d189bfcd0611c25b4adde | |
| parent | e41f15747eea34ea45e0258f0755145fcd10293b (diff) | |
| download | mruby-bd7328f5e606a59db25c6c17534f7db6c21fc13c.tar.gz mruby-bd7328f5e606a59db25c6c17534f7db6c21fc13c.zip | |
Implement `Rational._new` in C.
| -rw-r--r-- | mrbgems/mruby-rational/mrblib/rational.rb | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-rational/src/rational.c | 31 |
2 files changed, 26 insertions, 10 deletions
diff --git a/mrbgems/mruby-rational/mrblib/rational.rb b/mrbgems/mruby-rational/mrblib/rational.rb index 37e9d8c0f..870c12242 100644 --- a/mrbgems/mruby-rational/mrblib/rational.rb +++ b/mrbgems/mruby-rational/mrblib/rational.rb @@ -75,11 +75,6 @@ class Numeric end end -class << Rational - alias_method :_new, :new - undef_method :new -end - def Rational(numerator = 0, denominator = 1) a = numerator b = denominator diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index 03f373490..549715e7d 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -29,11 +29,24 @@ rational_denominator(mrb_state *mrb, mrb_value self) } static mrb_value -rational_initialize(mrb_state *mrb, mrb_value self) +rational_new(mrb_state *mrb, mrb_int numerator, mrb_int denominator) { - struct mrb_rational *p = rational_ptr(self); - mrb_get_args(mrb, "ii", &p->numerator, &p->denominator); - return self; + struct RClass *c = mrb_class_get(mrb, "Rational"); + struct RIStruct *s = (struct RIStruct*)mrb_obj_alloc(mrb, MRB_TT_ISTRUCT, c); + mrb_value rat = mrb_obj_value(s); + struct mrb_rational *p = rational_ptr(rat); + p->numerator = numerator; + p->denominator = denominator; + return mrb_obj_value(s); +} + +static mrb_value +rational_s_new(mrb_state *mrb, mrb_value self) +{ + mrb_int numerator, denominator; + + mrb_get_args(mrb, "ii", &numerator, &denominator); + return rational_new(mrb, numerator, denominator); } #ifndef MRB_WITHOUT_FLOAT @@ -70,6 +83,12 @@ rational_negative_p(mrb_state *mrb, mrb_value self) return mrb_false_value(); } +static mrb_value +fix_to_r(mrb_state *mrb, mrb_value self) +{ + return rational_new(mrb, mrb_fixnum(self), 1); +} + void mrb_mruby_rational_gem_init(mrb_state *mrb) { struct RClass *rat; @@ -77,15 +96,17 @@ void mrb_mruby_rational_gem_init(mrb_state *mrb) mrb_assert(sizeof(struct mrb_rational) < ISTRUCT_DATA_SIZE); rat = mrb_define_class(mrb, "Rational", mrb_class_get(mrb, "Numeric")); MRB_SET_INSTANCE_TT(rat, MRB_TT_ISTRUCT); + mrb_undef_class_method(mrb, rat, "new"); + mrb_define_class_method(mrb, rat, "_new", rational_s_new, MRB_ARGS_REQ(2)); mrb_define_method(mrb, rat, "numerator", rational_numerator, MRB_ARGS_NONE()); mrb_define_method(mrb, rat, "denominator", rational_denominator, MRB_ARGS_NONE()); - mrb_define_method(mrb, rat, "initialize", rational_initialize, MRB_ARGS_REQ(2)); #ifndef MRB_WITHOUT_FLOAT mrb_define_method(mrb, rat, "to_f", rational_to_f, MRB_ARGS_NONE()); #endif mrb_define_method(mrb, rat, "to_i", rational_to_i, MRB_ARGS_NONE()); mrb_define_method(mrb, rat, "to_r", rational_to_r, MRB_ARGS_NONE()); mrb_define_method(mrb, rat, "negative?", rational_negative_p, MRB_ARGS_NONE()); + mrb_define_method(mrb, mrb->fixnum_class, "to_r", fix_to_r, MRB_ARGS_NONE()); } void |
