diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-09-16 09:40:33 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-09-16 09:40:33 +0000 |
commit | 21d0b0785c4be76fac8c421af009aa57fbbb85f5 (patch) | |
tree | ea994af7deeef43977f60a9ab26131e8cd90a9a0 /range.c | |
parent | 1f72ff9b643dff5f4c5a40bf672a2525d66bd99f (diff) | |
download | ruby-21d0b0785c4be76fac8c421af009aa57fbbb85f5.tar.gz ruby-21d0b0785c4be76fac8c421af009aa57fbbb85f5.tar.xz ruby-21d0b0785c4be76fac8c421af009aa57fbbb85f5.zip |
1.4.1
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@527 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r-- | range.c | 24 |
1 files changed, 19 insertions, 5 deletions
@@ -134,14 +134,28 @@ range_each(range) rb_yield(INT2NUM(i)); } } - else { /* generic each */ + else if (TYPE(b) == T_STRING) { + rb_str_upto(b, e, EXCL(range)); + } + else { /* generic each */ VALUE v = b; - ID le = EXCL(range)?'<':rb_intern("<="); ID succ = rb_intern("succ"); - while (rb_funcall(v, le, 1, e)) { - rb_yield(v); - v = rb_funcall(v, succ, 0, 0); + if (EXCL(range)) { + while (RTEST(rb_funcall(v, '<', 1, e))) { + if (rb_equal(v, e)) break; + rb_yield(v); + v = rb_funcall(v, succ, 0, 0); + } + } + else { + ID le = rb_intern("<="); + + while (RTEST(rb_funcall(v, le, 1, e))) { + rb_yield(v); + if (rb_equal(v, e)) break; + v = rb_funcall(v, succ, 0, 0); + } } } |