aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--numeric.c2
-rw-r--r--object.c12
-rw-r--r--range.c19
4 files changed, 32 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index d05f49d41b..6704334476 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Aug 4 13:30:15 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * numeric.c (fix_div): should not convert the result into
+ integer. [ruby-core:05524]
+
Thu Aug 4 08:03:39 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/extmk.rb (extmake): should not modify $mflags for each
diff --git a/numeric.c b/numeric.c
index ec01d69260..fcf0ba1a79 100644
--- a/numeric.c
+++ b/numeric.c
@@ -2155,7 +2155,7 @@ fix_div(x, y)
x = rb_int2big(FIX2LONG(x));
return rb_big_div(x, y);
case T_FLOAT:
- return rb_Integer(rb_float_new((double)FIX2LONG(x) / RFLOAT(y)->value));
+ return rb_float_new((double)FIX2LONG(x) / RFLOAT(y)->value);
default:
return rb_num_coerce_bin(x, y);
}
diff --git a/object.c b/object.c
index d41f3570fd..436469ab40 100644
--- a/object.c
+++ b/object.c
@@ -2094,6 +2094,18 @@ rb_to_integer(val, method)
}
VALUE
+rb_check_to_integer(val, method)
+ VALUE val;
+ char *method;
+{
+ VALUE v = convert_type(val, "Integer", method, Qfalse);
+ if (!rb_obj_is_kind_of(v, rb_cInteger)) {
+ return Qnil;
+ }
+ return v;
+}
+
+VALUE
rb_to_int(val)
VALUE val;
{
diff --git a/range.c b/range.c
index 684db357a8..a361a347eb 100644
--- a/range.c
+++ b/range.c
@@ -466,12 +466,21 @@ rb_range_beg_len(range, begp, lenp, len, err)
long len;
int err;
{
- long beg, end, b, e;
+ VALUE b, e;
+ long beg, end;
- if (!rb_obj_is_kind_of(range, rb_cRange)) return Qfalse;
-
- beg = b = NUM2LONG(rb_ivar_get(range, id_beg));
- end = e = NUM2LONG(rb_ivar_get(range, id_end));
+ if (rb_obj_is_kind_of(range, rb_cRange)) {
+ b = rb_ivar_get(range, id_beg);
+ e = rb_ivar_get(range, id_end);
+ }
+ else {
+ b = rb_check_to_integer(range, "begin");
+ if (NIL_P(b)) return Qnil;
+ e = rb_check_to_integer(range, "end");
+ if (NIL_P(e)) return Qnil;
+ }
+ beg = NUM2LONG(b);
+ end = NUM2LONG(e);
if (beg < 0) {
beg += len;