diff --git a/ChangeLog b/ChangeLog index 129d4ee6fc..27691e8641 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri May 2 18:17:37 2003 Yukihiro Matsumoto + + * compar.c (cmp_gt): raises ArgumentError when "<=>" give nil. + inspired by discussion on comp.lang.python. + Fri May 2 17:37:01 2003 Yukihiro Matsumoto * lib/cgi/session.rb (CGI::Session::initialize): updated to diff --git a/compar.c b/compar.c index 42258d59cb..0a5a10ee23 100644 --- a/compar.c +++ b/compar.c @@ -30,6 +30,13 @@ rb_cmpint(val) return 0; } +static VALUE +cmperr() +{ + rb_raise(rb_eArgError, "comparison failed"); + return Qnil; /* not reached */ +} + static VALUE cmp_equal(x, y) VALUE x, y; @@ -37,8 +44,9 @@ cmp_equal(x, y) int c; if (x == y) return Qtrue; + c = rb_funcall(x, cmp, 1, y); - if (NIL_P(c)) return Qfalse; + if (NIL_P(c)) return Qnil; if (c == INT2FIX(0)) return Qtrue; if (rb_cmpint(c) == 0) return Qtrue; return Qfalse; @@ -50,7 +58,7 @@ cmp_gt(x, y) { VALUE c = rb_funcall(x, cmp, 1, y); - if (NIL_P(c)) return Qnil; + if (NIL_P(c)) return cmperr(); if (rb_cmpint(c) > 0) return Qtrue; return Qfalse; } @@ -61,7 +69,7 @@ cmp_ge(x, y) { VALUE c = rb_funcall(x, cmp, 1, y); - if (NIL_P(c)) return Qnil; + if (NIL_P(c)) return cmperr(); if (rb_cmpint(c) >= 0) return Qtrue; return Qfalse; } @@ -72,7 +80,7 @@ cmp_lt(x, y) { VALUE c = rb_funcall(x, cmp, 1, y); - if (NIL_P(c)) return Qnil; + if (NIL_P(c)) return cmperr(); if (rb_cmpint(c) < 0) return Qtrue; return Qfalse; } @@ -83,7 +91,7 @@ cmp_le(x, y) { VALUE c = rb_funcall(x, cmp, 1, y); - if (NIL_P(c)) return Qnil; + if (NIL_P(c)) return cmperr(); if (rb_cmpint(c) <= 0) return Qtrue; return Qfalse; }