diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-03-12 07:22:55 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-03-12 07:22:55 +0000 |
commit | 89843627b8ec3fe619d7b270500b08f1e014ca17 (patch) | |
tree | c90e86350ce6c43258468c3e31754a19f0be3413 /range.c | |
parent | 1acc981a539813e6ec2a5c50f3d91f946a4da1a6 (diff) |
range check
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@118 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r-- | range.c | 29 |
1 files changed, 21 insertions, 8 deletions
@@ -18,19 +18,32 @@ extern VALUE cNumeric; static ID upto; static VALUE +range_check(args) + VALUE *args; +{ + VALUE v = rb_funcall(args[0], rb_intern("<="), 1, args[1]); + + if (!RTEST(v)) { + Fail(""); /* no ascending values */ + } + return Qnil; +} + +static VALUE +range_failed() +{ + ArgError("bad value for range"); +} + +static VALUE range_s_new(klass, first, last) VALUE klass, first, last; { VALUE obj; + VALUE args[2]; - if (!(FIXNUM_P(first) && FIXNUM_P(last)) - && (TYPE(first) != TYPE(last) - || CLASS_OF(first) != CLASS_OF(last) - || !rb_respond_to(first, upto)) - && !(obj_is_kind_of(first, cNumeric) - && obj_is_kind_of(last, cNumeric))) { - ArgError("bad value for range"); - } + args[0] = first; args[1] = last; + rb_rescue(range_check, args, range_failed, 0); obj = obj_alloc(klass); |