diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-09-14 09:01:08 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-09-14 09:05:32 +0900 |
| commit | 76f1aa7de5cf449c1f75188a2a6bc9953133fa91 (patch) | |
| tree | 39fb9674912f55e707a28f4eab66935f7b9b0d68 /src/numeric.c | |
| parent | fcd3f8450d75033af8a0c472ee9c1352e1a8186e (diff) | |
| download | mruby-76f1aa7de5cf449c1f75188a2a6bc9953133fa91.tar.gz mruby-76f1aa7de5cf449c1f75188a2a6bc9953133fa91.zip | |
Remove `mrb_funcall` from `<=>` operations.
Diffstat (limited to 'src/numeric.c')
| -rw-r--r-- | src/numeric.c | 21 |
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) { |
