ruby-changes:2616
From: ko1@a...
Date: 5 Dec 2007 15:15:59 +0900
Subject: [ruby-changes:2616] nobu - Ruby:r14107 (ruby_1_8, trunk): * range.c (step_i, range_step): support non-fixnum steps.
nobu 2007-12-05 15:15:23 +0900 (Wed, 05 Dec 2007)
New Revision: 14107
Modified files:
branches/ruby_1_8/ChangeLog
branches/ruby_1_8/range.c
branches/ruby_1_8/version.h
trunk/ChangeLog
trunk/range.c
Log:
* range.c (step_i, range_step): support non-fixnum steps.
[ruby-talk:282100]
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/range.c?r1=14107&r2=14106
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=14107&r2=14106
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14107&r2=14106
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/range.c?r1=14107&r2=14106
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/version.h?r1=14107&r2=14106
Index: ChangeLog
===================================================================
--- ChangeLog (revision 14106)
+++ ChangeLog (revision 14107)
@@ -1,3 +1,8 @@
+Wed Dec 5 15:15:21 2007 Nobuyoshi Nakada <nobu@r...>
+
+ * range.c (step_i, range_step): support non-fixnum steps.
+ [ruby-talk:282100]
+
Wed Dec 5 14:25:11 2007 Koichi Sasada <ko1@a...>
* compile.c (iseq_compile_each): fix typo.
Index: range.c
===================================================================
--- range.c (revision 14106)
+++ range.c (revision 14107)
@@ -247,10 +247,16 @@
static VALUE
step_i(VALUE i, void *arg)
{
- long *iter = (long *)arg;
+ VALUE *iter = arg;
- iter[0]--;
- if (iter[0] == 0) {
+ if (FIXNUM_P(iter[0])) {
+ iter[0] -= INT2FIX(1) & ~FIXNUM_FLAG;
+ }
+ else {
+ VALUE one = INT2FIX(1);
+ iter[0] = rb_funcall(iter[0], '-', 1, &one);
+ }
+ if (iter[0] == INT2FIX(0)) {
rb_yield(i);
iter[0] = iter[1];
}
@@ -297,15 +303,22 @@
e = RANGE_END(range);
if (rb_scan_args(argc, argv, "01", &step) == 0) {
step = INT2FIX(1);
+ unit = 1;
}
-
- unit = NUM2LONG(step);
+ else if (FIXNUM_P(step)) {
+ unit = NUM2LONG(step);
+ }
+ else {
+ VALUE tmp = rb_to_int(step);
+ unit = rb_cmpint(tmp, step, INT2FIX(0));
+ step = tmp;
+ }
if (unit < 0) {
rb_raise(rb_eArgError, "step can't be negative");
- }
+ }
if (unit == 0)
rb_raise(rb_eArgError, "step can't be 0");
- if (FIXNUM_P(b) && FIXNUM_P(e)) { /* fixnums are special */
+ if (FIXNUM_P(b) && FIXNUM_P(e) && FIXNUM_P(step)) { /* fixnums are special */
long end = FIX2LONG(e);
long i;
@@ -322,14 +335,13 @@
VALUE tmp = rb_check_string_type(b);
if (!NIL_P(tmp)) {
- VALUE args[2];
- long iter[2];
+ VALUE args[2], iter[2];
b = tmp;
args[0] = e;
args[1] = EXCL(range) ? Qtrue : Qfalse;
- iter[0] = 1;
- iter[1] = unit;
+ iter[0] = INT2FIX(1);
+ iter[1] = step;
rb_block_call(b, rb_intern("upto"), 2, args, step_i, (VALUE)iter);
}
else if (rb_obj_is_kind_of(b, rb_cNumeric)) {
@@ -343,14 +355,14 @@
}
}
else {
- long args[2];
+ VALUE args[2];
if (!rb_respond_to(b, id_succ)) {
rb_raise(rb_eTypeError, "can't iterate from %s",
rb_obj_classname(b));
}
- args[0] = 1;
- args[1] = unit;
+ args[0] = INT2FIX(1);
+ args[1] = step;
range_each_func(range, step_i, b, e, args);
}
}
@@ -866,8 +878,6 @@
void
Init_Range(void)
{
- VALUE members;
-
id_cmp = rb_intern("<=>");
id_succ = rb_intern("succ");
id_beg = rb_intern("begin");
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog (revision 14106)
+++ ruby_1_8/ChangeLog (revision 14107)
@@ -1,3 +1,8 @@
+Wed Dec 5 15:15:21 2007 Nobuyoshi Nakada <nobu@r...>
+
+ * range.c (step_i, range_step): support non-fixnum steps.
+ [ruby-talk:282100]
+
Tue Dec 4 11:23:50 2007 Nobuyoshi Nakada <nobu@r...>
* bignum.c (rb_cstr_to_inum): trailing spaces may exist at sqeezing
Index: ruby_1_8/version.h
===================================================================
--- ruby_1_8/version.h (revision 14106)
+++ ruby_1_8/version.h (revision 14107)
@@ -1,7 +1,7 @@
#define RUBY_VERSION "1.8.6"
-#define RUBY_RELEASE_DATE "2007-12-04"
+#define RUBY_RELEASE_DATE "2007-12-05"
#define RUBY_VERSION_CODE 186
-#define RUBY_RELEASE_CODE 20071204
+#define RUBY_RELEASE_CODE 20071205
#define RUBY_PATCHLEVEL 5000
#define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 6
#define RUBY_RELEASE_YEAR 2007
#define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 4
+#define RUBY_RELEASE_DAY 5
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];
Index: ruby_1_8/range.c
===================================================================
--- ruby_1_8/range.c (revision 14106)
+++ ruby_1_8/range.c (revision 14107)
@@ -254,12 +254,20 @@
}
static VALUE
-step_i(i, iter)
+step_i(i, arg)
VALUE i;
- long *iter;
+ VALUE arg;
{
- iter[0]--;
- if (iter[0] == 0) {
+ VALUE *iter = (VALUE *)arg;
+
+ if (FIXNUM_P(iter[0])) {
+ iter[0] -= INT2FIX(1) & ~FIXNUM_FLAG;
+ }
+ else {
+ VALUE one = INT2FIX(1);
+ iter[0] = rb_funcall(iter[0], '-', 1, &one);
+ }
+ if (iter[0] == INT2FIX(0)) {
rb_yield(i);
iter[0] = iter[1];
}
@@ -307,13 +315,22 @@
e = rb_ivar_get(range, id_end);
if (rb_scan_args(argc, argv, "01", &step) == 0) {
step = INT2FIX(1);
+ unit = 1;
}
-
- unit = NUM2LONG(step);
+ else if (FIXNUM_P(step)) {
+ unit = NUM2LONG(step);
+ }
+ else {
+ VALUE tmp = rb_to_int(step);
+ unit = rb_cmpint(tmp, step, INT2FIX(0));
+ step = tmp;
+ }
if (unit < 0) {
rb_raise(rb_eArgError, "step can't be negative");
- }
- if (FIXNUM_P(b) && FIXNUM_P(e)) { /* fixnums are special */
+ }
+ if (unit == 0)
+ rb_raise(rb_eArgError, "step can't be 0");
+ if (FIXNUM_P(b) && FIXNUM_P(e) && FIXNUM_P(step)) { /* fixnums are special */
long end = FIX2LONG(e);
long i;
@@ -330,36 +347,32 @@
VALUE tmp = rb_check_string_type(b);
if (!NIL_P(tmp)) {
- VALUE args[5];
- long iter[2];
+ VALUE args[5], iter[2];
b = tmp;
- if (unit == 0) rb_raise(rb_eArgError, "step can't be 0");
args[0] = b; args[1] = e; args[2] = range;
- iter[0] = 1; iter[1] = unit;
+ iter[0] = INT2FIX(1); iter[1] = step;
rb_iterate((VALUE(*)_((VALUE)))str_step, (VALUE)args, step_i,
(VALUE)iter);
}
else if (rb_obj_is_kind_of(b, rb_cNumeric)) {
ID c = rb_intern(EXCL(range) ? "<" : "<=");
- if (rb_equal(step, INT2FIX(0))) rb_raise(rb_eArgError, "step can't be 0");
while (RTEST(rb_funcall(b, c, 1, e))) {
rb_yield(b);
b = rb_funcall(b, '+', 1, step);
}
}
else {
- long args[2];
+ VALUE args[2];
- if (unit == 0) rb_raise(rb_eArgError, "step can't be 0");
if (!rb_respond_to(b, id_succ)) {
rb_raise(rb_eTypeError, "can't iterate from %s",
rb_obj_classname(b));
}
- args[0] = 1;
- args[1] = unit;
+ args[0] = INT2FIX(1);
+ args[1] = step;
range_each_func(range, step_i, b, e, args);
}
}
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml