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

ruby-changes:16527

From: akr <ko1@a...>
Date: Fri, 2 Jul 2010 05:39:48 +0900 (JST)
Subject: [ruby-changes:16527] Ruby:r28518 (trunk): * numeric.c (rb_num2long): accept LONG_MAX < x < LONG_MAX+1 and

akr	2010-07-02 05:39:32 +0900 (Fri, 02 Jul 2010)

  New Revision: 28518

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

  Log:
    * numeric.c (rb_num2long): accept LONG_MAX < x < LONG_MAX+1 and
      LONG_MIN-1 < x < LONG_MIN as well because they are converted
      into the valid range of long by truncation.
      (rb_num2ulong): accept ULONG_MAX < x < ULONG_MAX+1 and
      LONG_MIN-1 < x < LONG_MIN as well.
      (rb_num2ll): accept LLONG_MAX < x < LLONG_MAX+1 and
      LLONG_MIN-1 < x < LLONG_MIN.

  Modified files:
    trunk/ChangeLog
    trunk/numeric.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28517)
+++ ChangeLog	(revision 28518)
@@ -1,3 +1,13 @@
+Fri Jul  2 05:31:51 2010  Tanaka Akira  <akr@f...>
+
+	* numeric.c (rb_num2long): accept LONG_MAX < x < LONG_MAX+1 and
+	  LONG_MIN-1 < x < LONG_MIN as well because they are converted
+	  into the valid range of long by truncation.
+	  (rb_num2ulong): accept ULONG_MAX < x < ULONG_MAX+1 and
+	  LONG_MIN-1 < x < LONG_MIN as well.
+	  (rb_num2ll): accept LLONG_MAX < x < LLONG_MAX+1 and
+	  LLONG_MIN-1 < x < LLONG_MIN.
+
 Thu Jul  1 23:10:25 2010  James Edward Gray II  <jeg2@r...>
 
 	* lib/csv.rb: Improving documentation.
Index: numeric.c
===================================================================
--- numeric.c	(revision 28517)
+++ numeric.c	(revision 28518)
@@ -1683,6 +1683,10 @@
     return from;
 }
 
+#define LONG_MIN_MINUS_ONE ((double)LONG_MIN-1)
+#define LONG_MAX_PLUS_ONE (2*(double)(LONG_MAX/2+1))
+#define ULONG_MAX_PLUS_ONE (2*(double)(ULONG_MAX/2+1))
+
 SIGNED_VALUE
 rb_num2long(VALUE val)
 {
@@ -1695,8 +1699,8 @@
 
     switch (TYPE(val)) {
       case T_FLOAT:
-	if (RFLOAT_VALUE(val) <= (double)LONG_MAX
-	    && RFLOAT_VALUE(val) >= (double)LONG_MIN) {
+	if (RFLOAT_VALUE(val) < LONG_MAX_PLUS_ONE
+	    && RFLOAT_VALUE(val) > LONG_MIN_MINUS_ONE) {
 	    return (SIGNED_VALUE)(RFLOAT_VALUE(val));
 	}
 	else {
@@ -1729,8 +1733,8 @@
 
     switch (TYPE(val)) {
       case T_FLOAT:
-       if (RFLOAT_VALUE(val) <= (double)ULONG_MAX
-           && RFLOAT_VALUE(val) >= (double)LONG_MIN) {
+       if (RFLOAT_VALUE(val) < ULONG_MAX_PLUS_ONE
+           && RFLOAT_VALUE(val) > LONG_MIN_MINUS_ONE) {
            return (VALUE)RFLOAT_VALUE(val);
        }
        else {
@@ -1853,6 +1857,10 @@
 
 #if HAVE_LONG_LONG
 
+#define LLONG_MIN_MINUS_ONE ((double)LLONG_MIN-1)
+#define LLONG_MAX_PLUS_ONE (2*(double)(LLONG_MAX/2+1))
+#define ULLONG_MAX_PLUS_ONE (2*(double)(ULLONG_MAX/2+1))
+
 LONG_LONG
 rb_num2ll(VALUE val)
 {
@@ -1864,8 +1872,8 @@
 
     switch (TYPE(val)) {
       case T_FLOAT:
-	if (RFLOAT_VALUE(val) <= (double)LLONG_MAX
-	    && RFLOAT_VALUE(val) >= (double)LLONG_MIN) {
+	if (RFLOAT_VALUE(val) < LLONG_MAX_PLUS_ONE
+	    && RFLOAT_VALUE(val) > LLONG_MIN_MINUS_ONE) {
 	    return (LONG_LONG)(RFLOAT_VALUE(val));
 	}
 	else {

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

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