diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | numeric.c | 28 |
2 files changed, 29 insertions, 4 deletions
@@ -1,3 +1,8 @@ +Thu May 8 08:56:04 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net> + + * numeric.c (int_upto, int_downto): should fail unless the + argument is comparable. (ruby-bugs-ja:PR#454) + Wed May 7 01:21:23 2003 Yukihiro Matsumoto <matz@ruby-lang.org> * numeric.c (num_step): remove epsilon; add margin of 0.5, to make @@ -1654,6 +1654,28 @@ fix_size(fix) } static VALUE +int_compare(i, to, id) + VALUE i, to; + ID id; +{ + VALUE cmp = rb_funcall(i, id, 1, to); + if (NIL_P(cmp)) { + char *toclass; + + if (SPECIAL_CONST_P(to)) { + to = rb_inspect(to); + toclass = StringValuePtr(to); + } + else { + toclass = rb_obj_classname(to); + } + rb_raise(rb_eArgError, "cannot compare %s with %s", + rb_obj_classname(i), toclass); + } + return cmp; +} + +static VALUE int_upto(from, to) VALUE from, to; { @@ -1668,8 +1690,7 @@ int_upto(from, to) else { VALUE i = from; - for (;;) { - if (RTEST(rb_funcall(i, '>', 1, to))) break; + while (!int_compare(i, to, '>')) { rb_yield(i); i = rb_funcall(i, '+', 1, INT2FIX(1)); } @@ -1692,8 +1713,7 @@ int_downto(from, to) else { VALUE i = from; - for (;;) { - if (RTEST(rb_funcall(i, '<', 1, to))) break; + while (!int_compare(i, to, '<')) { rb_yield(i); i = rb_funcall(i, '-', 1, INT2FIX(1)); } |