From 3adae7d2375e21e2009c93ff9f3690d1ebaca51f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?fn=20=E2=8C=83=20=E2=8C=A5?= <70830482+FnControlOption@users.noreply.github.com> Date: Wed, 26 Oct 2022 08:55:29 -0700 Subject: [PATCH 1/2] mruby-compar-ext/compar.rb (clamp): fix range support. Also, raise error if any comparison among min, max, and self returns nil. --- mrbgems/mruby-compar-ext/mrblib/compar.rb | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-compar-ext/mrblib/compar.rb b/mrbgems/mruby-compar-ext/mrblib/compar.rb index 3b1fdb7f8..18bba7919 100644 --- a/mrbgems/mruby-compar-ext/mrblib/compar.rb +++ b/mrbgems/mruby-compar-ext/mrblib/compar.rb @@ -43,13 +43,13 @@ module Comparable def clamp(min, max=nil) if max.nil? if min.kind_of?(Range) - max = min.begin + max = min.end if max.nil? max = self elsif min.exclude_end? raise ArgumentError, "cannot clamp with an exclusive range" end - min = min.end + min = min.begin if min.nil? min = self end @@ -57,17 +57,24 @@ module Comparable raise TypeError, "wrong argument type #{min.class}" end end - if (min <=> max) > 0 + c = min <=> max + if c.nil? + raise ArgumentError, "comparison of #{min.class} with #{max.class} failed" + elsif c > 0 raise ArgumentError, "min argument must be smaller than max argument" end c = self <=> min - if c == 0 + if c.nil? + raise ArgumentError, "comparison of #{self.class} with #{min.class} failed" + elsif c == 0 return self elsif c < 0 return min end c = self <=> max - if c > 0 + if c.nil? + raise ArgumentError, "comparison of #{self.class} with #{max.class} failed" + elsif c > 0 return max else return self From c1697a9c4e1c82fec53b499e0e2d76271f8b351a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?fn=20=E2=8C=83=20=E2=8C=A5?= <70830482+FnControlOption@users.noreply.github.com> Date: Wed, 26 Oct 2022 08:57:30 -0700 Subject: [PATCH 2/2] kernel.c (mrb_cmp_m): implement `Kernel#<=>` --- src/kernel.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/kernel.c b/src/kernel.c index 73e28f468..59bdf1f9c 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -78,6 +78,16 @@ mrb_equal_m(mrb_state *mrb, mrb_value self) return mrb_bool_value(mrb_equal(mrb, self, arg)); } +static mrb_value +mrb_cmp_m(mrb_state *mrb, mrb_value self) +{ + mrb_value arg = mrb_get_arg1(mrb); + + if (mrb_obj_equal(mrb, self, arg)) + return mrb_fixnum_value(0); + return mrb_nil_value(); +} + /* 15.3.1.3.3 */ /* 15.3.1.3.33 */ /* @@ -534,6 +544,7 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "===", mrb_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.2 */ + mrb_define_method(mrb, krn, "<=>", mrb_cmp_m, MRB_ARGS_REQ(1)); mrb_define_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.6 */ mrb_define_method(mrb, krn, "class", mrb_obj_class_m, MRB_ARGS_NONE()); /* 15.3.1.3.7 */ mrb_define_method(mrb, krn, "clone", mrb_obj_clone, MRB_ARGS_NONE()); /* 15.3.1.3.8 */