ruby-changes:1717
From: ko1@a...
Date: 22 Aug 2007 11:48:43 +0900
Subject: [ruby-changes:1717] shyouhei - Ruby:r13208 (ruby_1_8_6): * bignum.c (rb_big_aref): check for Bignum index range.
shyouhei 2007-08-22 11:48:36 +0900 (Wed, 22 Aug 2007)
New Revision: 13208
Modified files:
branches/ruby_1_8_6/ChangeLog
branches/ruby_1_8_6/bignum.c
branches/ruby_1_8_6/version.h
Log:
* bignum.c (rb_big_aref): check for Bignum index range.
[ruby-dev:31271]
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=13208&r2=13207
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=13208&r2=13207
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/bignum.c?r1=13208&r2=13207
Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog (revision 13207)
+++ ruby_1_8_6/ChangeLog (revision 13208)
@@ -1,3 +1,8 @@
+Wed Aug 22 11:47:11 2007 Nobuyoshi Nakada <nobu@r...>
+
+ * bignum.c (rb_big_aref): check for Bignum index range.
+ [ruby-dev:31271]
+
Wed Aug 22 11:41:44 2007 Nobuyoshi Nakada <nobu@r...>
* dln.c (conv_to_posix_path): removed.
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h (revision 13207)
+++ ruby_1_8_6/version.h (revision 13208)
@@ -2,7 +2,7 @@
#define RUBY_RELEASE_DATE "2007-08-22"
#define RUBY_VERSION_CODE 186
#define RUBY_RELEASE_CODE 20070822
-#define RUBY_PATCHLEVEL 80
+#define RUBY_PATCHLEVEL 81
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 8
Index: ruby_1_8_6/bignum.c
===================================================================
--- ruby_1_8_6/bignum.c (revision 13207)
+++ ruby_1_8_6/bignum.c (revision 13208)
@@ -2049,29 +2049,39 @@
VALUE x, y;
{
BDIGIT *xds;
- int shift;
- long s1, s2;
+ BDIGIT_DBL num;
+ unsigned long shift;
+ long i, s1, s2;
if (TYPE(y) == T_BIGNUM) {
- if (!RBIGNUM(y)->sign || RBIGNUM(x)->sign)
+ if (!RBIGNUM(y)->sign)
return INT2FIX(0);
- return INT2FIX(1);
+ if (RBIGNUM(bigtrunc(y))->len > SIZEOF_LONG/SIZEOF_BDIGITS) {
+ out_of_range:
+ return RBIGNUM(x)->sign ? INT2FIX(0) : INT2FIX(1);
+ }
+ shift = big2ulong(y, "long", Qfalse);
}
- shift = NUM2INT(y);
- if (shift < 0) return INT2FIX(0);
+ else {
+ i = NUM2LONG(y);
+ if (i < 0) return INT2FIX(0);
+ shift = (VALUE)i;
+ }
s1 = shift/BITSPERDIG;
s2 = shift%BITSPERDIG;
+ if (s1 >= RBIGNUM(x)->len) goto out_of_range;
if (!RBIGNUM(x)->sign) {
- if (s1 >= RBIGNUM(x)->len) return INT2FIX(1);
- x = rb_big_clone(x);
- get2comp(x);
+ xds = BDIGITS(x);
+ i = 0; num = 1;
+ while (num += ~xds[i], ++i <= s1) {
+ num = BIGDN(num);
+ }
}
else {
- if (s1 >= RBIGNUM(x)->len) return INT2FIX(0);
+ num = BDIGITS(x)[s1];
}
- xds = BDIGITS(x);
- if (xds[s1] & (1<<s2))
+ if (num & ((BDIGIT_DBL)1<<s2))
return INT2FIX(1);
return INT2FIX(0);
}
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml