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

ruby-changes:6813

From: shyouhei <ko1@a...>
Date: Mon, 4 Aug 2008 13:31:17 +0900 (JST)
Subject: [ruby-changes:6813] Ruby:r18329 (ruby_1_8_6): merge revision(s) 18100,18129:

shyouhei	2008-08-04 13:31:06 +0900 (Mon, 04 Aug 2008)

  New Revision: 18329

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

  Log:
    merge revision(s) 18100,18129:
    * numeric.c (check_uint, rb_num2uint, rb_fix2uint): strict check.
      fixed [ruby-dev:33683]
    * numeric.c (check_uint, rb_num2uint, rb_fix2uint): fixed wrong check
      about 64bit positive value.

  Modified files:
    branches/ruby_1_8_6/ChangeLog
    branches/ruby_1_8_6/numeric.c
    branches/ruby_1_8_6/version.h

Index: ruby_1_8_6/numeric.c
===================================================================
--- ruby_1_8_6/numeric.c	(revision 18328)
+++ ruby_1_8_6/numeric.c	(revision 18329)
@@ -1597,12 +1597,22 @@
 }
 
 static void
-check_uint(num)
+check_uint(num, sign)
     unsigned long num;
+    VALUE sign;
 {
-    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;
+
+    if (RTEST(sign)) {
+	/* minus */
+	if ((num & mask) != mask || (num & ~mask) <= INT_MAX + 1UL)
+	    rb_raise(rb_eRangeError, "integer %ld too small to convert to `unsigned int'", num);
     }
+    else {
+	/* plus */
+	if ((num & mask) != 0)
+	    rb_raise(rb_eRangeError, "integer %lu too big to convert to `unsigned int'", num);
+    }
 }
 
 long
@@ -1631,9 +1641,7 @@
 {
     unsigned long num = rb_num2ulong(val);
 
-    if (RTEST(rb_funcall(INT2FIX(0), '<', 1, val))) {
-	check_uint(num);
-    }
+    check_uint(num, rb_funcall(val, '<', 1, INT2FIX(0)));
     return num;
 }
 
@@ -1647,9 +1655,8 @@
         return rb_num2uint(val);
     }
     num = FIX2ULONG(val);
-    if (FIX2LONG(val) > 0) {
-	check_uint(num);
-    }
+
+    check_uint(num, rb_funcall(val, '<', 1, INT2FIX(0)));
     return num;
 }
 #else
Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog	(revision 18328)
+++ ruby_1_8_6/ChangeLog	(revision 18329)
@@ -1,3 +1,12 @@
+Mon Aug  4 12:25:08 2008  NAKAMURA Usaku  <usa@r...>
+
+	* numeric.c (check_uint, rb_num2uint, rb_fix2uint): fixed wrong check
+	  about 64bit positive value.
+Mon Aug  4 12:25:08 2008  NAKAMURA Usaku  <usa@r...>
+
+	* numeric.c (check_uint, rb_num2uint, rb_fix2uint): strict check.
+	  fixed [ruby-dev:33683]
+
 Mon Aug  4 12:11:29 2008  Tanaka Akira  <akr@f...>
 
 	* gc.c (Init_GC): fix syntax error.
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h	(revision 18328)
+++ ruby_1_8_6/version.h	(revision 18329)
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2008-08-04"
 #define RUBY_VERSION_CODE 186
 #define RUBY_RELEASE_CODE 20080804
-#define RUBY_PATCHLEVEL 280
+#define RUBY_PATCHLEVEL 281
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8

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

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