[前][次][番号順一覧][スレッド一覧]

ruby-changes:6584

From: usa <ko1@a...>
Date: Thu, 17 Jul 2008 10:33:17 +0900 (JST)
Subject: [ruby-changes:6584] Ruby:r18100 (ruby_1_8): * numeric.c (check_uint, rb_num2uint, rb_fix2uint): strict check.

usa	2008-07-17 10:32:58 +0900 (Thu, 17 Jul 2008)

  New Revision: 18100

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18100

  Log:
    * numeric.c (check_uint, rb_num2uint, rb_fix2uint): strict check.
      fixed [ruby-dev:33683]

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/numeric.c

Index: ruby_1_8/numeric.c
===================================================================
--- ruby_1_8/numeric.c	(revision 18099)
+++ ruby_1_8/numeric.c	(revision 18100)
@@ -1603,8 +1603,17 @@
 check_uint(num)
     unsigned long num;
 {
-    if (num > UINT_MAX) {
-	rb_raise(rb_eRangeError, "integer %lu too big to convert to `unsigned int'", num);
+    static const unsigned long mask = ~(unsigned long)UINT_MAX;
+    static const unsigned long msb = ~LONG_MAX;
+    const char *s;
+
+    if ((num & mask) != 0 &&
+	((num & mask) != mask || (num & ~mask) <= INT_MAX + 1UL)) {
+	if ((num & msb) == 0)
+	    s = "big";
+	else
+	    s = "small";
+	rb_raise(rb_eRangeError, "integer %ld too %s to convert to `unsigned int'", num, s);
     }
 }
 
@@ -1634,10 +1643,7 @@
 {
     unsigned long num = rb_num2ulong(val);
 
-    if (RTEST(rb_funcall(val, '<', 1, INT2FIX(0))))
-	check_int(num);
-    else
-	check_uint(num);
+    check_uint(num);
     return num;
 }
 
@@ -1651,10 +1657,8 @@
         return rb_num2uint(val);
     }
     num = FIX2ULONG(val);
-    if (RTEST(rb_funcall(val, '<', 1, INT2FIX(0))))
-	check_int(num);
-    else
-	check_uint(num);
+
+    check_uint(num);
     return num;
 }
 #else
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 18099)
+++ ruby_1_8/ChangeLog	(revision 18100)
@@ -1,3 +1,8 @@
+Thu Jul 17 10:32:40 2008  NAKAMURA Usaku  <usa@r...>
+
+	* numeric.c (check_uint, rb_num2uint, rb_fix2uint): strict check.
+	  fixed [ruby-dev:33683]
+
 Tue Jul 15 23:00:17 2008  NAKAMURA Usaku  <usa@r...>
 
 	* {bcc32,win32}/Makefile.sub (ruby_version): follow changes in

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]