From 89c25a3dd633f8cbb788be42d84f0ad06b768b51 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 7 May 2003 23:56:11 +0000 Subject: * numeric.c (int_upto, int_downto): should fail unless the argument is comparable. (ruby-bugs-ja:PR#454) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3766 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- numeric.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'numeric.c') 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)); } -- cgit v1.2.3