summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--insns.def11
-rw-r--r--range.c2
3 files changed, 19 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index b874557d98..44cea7dcae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Thu Jul 12 18:42:18 2007 Tanaka Akira <akr@fsij.org>
+
+ * range.c (range_max): use FIX2LONG instead of FIX2INT to avoid
+ RangeError by ((-0x80000001)...(-0x80000001)).max on LP64.
+
+ * insns.def (opt_plus): use FIX2LONG instead of FIX2INT to avoid
+ RangeError by 0x3fffffffffffffff+1 on LP64.
+
+ * insns.def (opt_succ): don't use 0x80000000 which assumes 32bit VALUE.
+ use FIX2LONG instead of FIX2INT.
+ [ruby-dev:31190]
+
Thu Jul 12 17:03:15 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* struct.c (rb_struct_init_copy): disallow changing the size.
diff --git a/insns.def b/insns.def
index 5e0f49b750..9fc4fcc9d4 100644
--- a/insns.def
+++ b/insns.def
@@ -1677,8 +1677,8 @@ opt_plus
val = (recv + (obj & (~1)));
if ((~(recv ^ obj) & (recv ^ val)) &
((VALUE)0x01 << ((sizeof(VALUE) * CHAR_BIT) - 1))) {
- val = rb_big_plus(rb_int2big(FIX2INT(recv)),
- rb_int2big(FIX2INT(obj)));
+ val = rb_big_plus(rb_int2big(FIX2LONG(recv)),
+ rb_int2big(FIX2LONG(obj)));
}
#else
long a, b, c;
@@ -2304,9 +2304,10 @@ opt_succ
const VALUE obj = INT2FIX(1);
/* fixnum + INT2FIX(1) */
val = (recv + (obj & (~1)));
- if ((~(recv ^ obj) & (recv ^ val)) & 0x80000000) {
- val = rb_big_plus(rb_int2big(FIX2INT(recv)),
- rb_int2big(FIX2INT(obj)));
+ if ((~(recv ^ obj) & (recv ^ val)) &
+ ((VALUE)0x01 << ((sizeof(VALUE) * CHAR_BIT) - 1))) {
+ val = rb_big_plus(rb_int2big(FIX2LONG(recv)),
+ rb_int2big(FIX2LONG(obj)));
}
}
else {
diff --git a/range.c b/range.c
index e1dee57835..a63919d0d9 100644
--- a/range.c
+++ b/range.c
@@ -503,7 +503,7 @@ range_max(VALUE range)
return Qnil;
if (EXCL(range)) {
if (FIXNUM_P(e)) {
- return INT2NUM(FIX2INT(e) - 1);
+ return LONG2NUM(FIX2LONG(e) - 1);
}
return rb_funcall(e, '-', 1, INT2FIX(1));
}