summaryrefslogtreecommitdiff
path: root/range.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-22 16:23:16 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-22 16:23:16 +0000
commit115410ecde172034fdbfdea703252dcfc6ea0468 (patch)
tree32490f38e9262bd323db96dea85aa16e1e58576b /range.c
parentf11a6f2d65e01b966e5053ea8438d5e6c590c423 (diff)
* string.c (rb_str_upto): add optional argument to specify
exclusiveness. * range.c (range_step): use String#upto with optional argument. * range.c (range_each): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12586 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r--range.c31
1 files changed, 9 insertions, 22 deletions
diff --git a/range.c b/range.c
index ec866de8eb..e1dee57835 100644
--- a/range.c
+++ b/range.c
@@ -218,14 +218,6 @@ range_hash(VALUE range)
return LONG2FIX(hash);
}
-static VALUE
-str_step(VALUE arg)
-{
- VALUE *args = (VALUE *)arg;
-
- return rb_str_upto(args[0], args[1], EXCL(args[2]));
-}
-
static void
range_each_func(VALUE range, VALUE (*func) (VALUE, void *), VALUE v, VALUE e,
void *arg)
@@ -323,16 +315,15 @@ range_step(int argc, VALUE *argv, VALUE range)
VALUE tmp = rb_check_string_type(b);
if (!NIL_P(tmp)) {
- VALUE args[5];
+ VALUE args[2];
long iter[2];
b = tmp;
- args[0] = b;
- args[1] = e;
- args[2] = range;
+ args[0] = e;
+ args[1] = EXCL(range) ? Qtrue : Qfalse;
iter[0] = 1;
iter[1] = unit;
- rb_iterate(str_step, (VALUE)args, step_i, (VALUE)iter);
+ rb_block_call(b, rb_intern("upto"), 2, args, step_i, (VALUE)iter);
}
else if (rb_obj_is_kind_of(b, rb_cNumeric)) {
ID c = rb_intern(EXCL(range) ? "<" : "<=");
@@ -409,15 +400,11 @@ range_each(VALUE range)
}
}
else if (TYPE(beg) == T_STRING) {
- VALUE args[5];
- long iter[2];
-
- args[0] = beg;
- args[1] = end;
- args[2] = range;
- iter[0] = 1;
- iter[1] = 1;
- rb_iterate(str_step, (VALUE)args, step_i, (VALUE)iter);
+ VALUE args[2];
+
+ args[0] = end;
+ args[1] = EXCL(range) ? Qtrue : Qfalse;
+ rb_block_call(beg, rb_intern("upto"), 2, args, rb_yield, 0);
}
else {
range_each_func(range, each_i, beg, end, NULL);