summaryrefslogtreecommitdiffhomepage
path: root/src/numeric.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-09-14 09:01:08 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-09-14 09:05:32 +0900
commit76f1aa7de5cf449c1f75188a2a6bc9953133fa91 (patch)
tree39fb9674912f55e707a28f4eab66935f7b9b0d68 /src/numeric.c
parentfcd3f8450d75033af8a0c472ee9c1352e1a8186e (diff)
downloadmruby-76f1aa7de5cf449c1f75188a2a6bc9953133fa91.tar.gz
mruby-76f1aa7de5cf449c1f75188a2a6bc9953133fa91.zip
Remove `mrb_funcall` from `<=>` operations.
Diffstat (limited to 'src/numeric.c')
-rw-r--r--src/numeric.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/numeric.c b/src/numeric.c
index 638f75fd8..d4ada1809 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -1553,6 +1553,27 @@ integral_ge(mrb_state *mrb, mrb_value self)
return mrb_false_value();
}
+MRB_API mrb_int
+mrb_cmp(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
+{
+ mrb_value v;
+
+ switch (mrb_type(obj1)) {
+ case MRB_TT_FIXNUM:
+ case MRB_TT_FLOAT:
+ return cmpnum(mrb, obj1, obj2);
+ case MRB_TT_STRING:
+ if (mrb_type(obj2) != MRB_TT_STRING)
+ return -2;
+ return mrb_str_cmp(mrb, obj1, obj2);
+ default:
+ v = mrb_funcall(mrb, obj1, "<=>", 1, obj2);
+ if (mrb_nil_p(v) || !mrb_fixnum_p(v))
+ return -2;
+ return mrb_fixnum(v);
+ }
+}
+
static mrb_value
num_finite_p(mrb_state *mrb, mrb_value self)
{