diff --git a/ChangeLog b/ChangeLog index b8de4e2533..42eab2cf84 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu May 8 08:56:04 2003 Nobuyoshi Nakada + + * 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 * numeric.c (num_step): remove epsilon; add margin of 0.5, to make diff --git a/numeric.c b/numeric.c index afc3590644..edc42ef6bd 100644 --- a/numeric.c +++ b/numeric.c @@ -1653,6 +1653,28 @@ fix_size(fix) return INT2FIX(sizeof(long)); } +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)); }