summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-05-18 11:23:59 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-05-18 11:23:59 +0900
commitbd7328f5e606a59db25c6c17534f7db6c21fc13c (patch)
treef68948454a87bb3bce9d189bfcd0611c25b4adde
parente41f15747eea34ea45e0258f0755145fcd10293b (diff)
downloadmruby-bd7328f5e606a59db25c6c17534f7db6c21fc13c.tar.gz
mruby-bd7328f5e606a59db25c6c17534f7db6c21fc13c.zip
Implement `Rational._new` in C.
-rw-r--r--mrbgems/mruby-rational/mrblib/rational.rb5
-rw-r--r--mrbgems/mruby-rational/src/rational.c31
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