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

ruby-changes:16189

From: wyhaines <ko1@a...>
Date: Fri, 4 Jun 2010 07:58:37 +0900 (JST)
Subject: [ruby-changes:16189] Ruby:r28153 (ruby_1_8_6): Backport #2392 ; backport of r23353 which suppresses a strict-aliasing warning in gcc-4.4.x -O2.

wyhaines	2010-06-04 07:58:28 +0900 (Fri, 04 Jun 2010)

  New Revision: 28153

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

  Log:
    Backport #2392 [ruby-core:26868]; backport of r23353 which suppresses a strict-aliasing warning in gcc-4.4.x -O2.

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

Index: ruby_1_8_6/util.c
===================================================================
--- ruby_1_8_6/util.c	(revision 28152)
+++ ruby_1_8_6/util.c	(revision 28153)
@@ -951,24 +951,26 @@
 typedef union { double d; ULong L[2]; } U;
 
 #ifdef YES_ALIAS
-#define dval(x) x
-#ifdef IEEE_LITTLE_ENDIAN
-#define word0(x) ((ULong *)&x)[1]
-#define word1(x) ((ULong *)&x)[0]
+typedef double double_u;
+#  define dval(x) x
+#  ifdef IEEE_LITTLE_ENDIAN
+#    define word0(x) (((ULong *)&x)[1])
+#    define word1(x) (((ULong *)&x)[0])
+#  else
+#    define word0(x) (((ULong *)&x)[0])
+#    define word1(x) (((ULong *)&x)[1])
+#  endif
 #else
-#define word0(x) ((ULong *)&x)[0]
-#define word1(x) ((ULong *)&x)[1]
+typedef U double_u;
+#  ifdef IEEE_LITTLE_ENDIAN
+#    define word0(x) (x.L[1])
+#    define word1(x) (x.L[0])
+#  else
+#    define word0(x) (x.L[0])
+#    define word1(x) (x.L[1])
+#  endif
+#  define dval(x) (x.d)
 #endif
-#else
-#ifdef IEEE_LITTLE_ENDIAN
-#define word0(x) ((U*)&x)->L[1]
-#define word1(x) ((U*)&x)->L[0]
-#else
-#define word0(x) ((U*)&x)->L[0]
-#define word1(x) ((U*)&x)->L[1]
-#endif
-#define dval(x) ((U*)&x)->d
-#endif
 
 /* The following definition of Storeinc is appropriate for MIPS processors.
  * An alternative that might be better on some machines is
@@ -1697,10 +1699,11 @@
 }
 
 static double
-ulp(double x)
+ulp(double x_)
 {
     register Long L;
-    double a;
+    double_u x, a;
+    dval(x) = x_;
 
     L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
 #ifndef Avoid_Underflow
@@ -1738,7 +1741,7 @@
 {
     ULong *xa, *xa0, w, y, z;
     int k;
-    double d;
+    double_u d;
 #ifdef VAX
     ULong d0, d1;
 #else
@@ -1799,8 +1802,9 @@
 }
 
 static Bigint *
-d2b(double d, int *e, int *bits)
+d2b(double d_, int *e, int *bits)
 {
+    double_u d;
     Bigint *b;
     int de, k;
     ULong *x, y, z;
@@ -1809,6 +1813,9 @@
 #endif
 #ifdef VAX
     ULong d0, d1;
+#endif
+    dval(d) = d_;
+#ifdef VAX
     d0 = word0(d) >> 16 | word0(d) << 16;
     d1 = word1(d) >> 16 | word1(d) << 16;
 #else
@@ -1934,7 +1941,7 @@
 static double
 ratio(Bigint *a, Bigint *b)
 {
-    double da, db;
+    double_u da, db;
     int k, ka, kb;
 
     dval(da) = b2d(a, &ka);
@@ -2093,7 +2100,8 @@
     int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
          e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
     const char *s, *s0, *s1;
-    double aadj, aadj1, adj, rv, rv0;
+    double aadj, adj;
+    double_u aadj1, rv, rv0;
     Long L;
     ULong y, z;
     Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
@@ -2791,14 +2799,14 @@
         }
         if ((aadj = ratio(delta, bs)) <= 2.) {
             if (dsign)
-                aadj = aadj1 = 1.;
+                aadj = dval(aadj1) = 1.;
             else if (word1(rv) || word0(rv) & Bndry_mask) {
 #ifndef Sudden_Underflow
                 if (word1(rv) == Tiny1 && !word0(rv))
                     goto undfl;
 #endif
                 aadj = 1.;
-                aadj1 = -1.;
+                dval(aadj1) = -1.;
             }
             else {
                 /* special case -- power of FLT_RADIX to be */
@@ -2808,12 +2816,12 @@
                     aadj = 1./FLT_RADIX;
                 else
                     aadj *= 0.5;
-                aadj1 = -aadj;
+                dval(aadj1) = -aadj;
             }
         }
         else {
             aadj *= 0.5;
-            aadj1 = dsign ? aadj : -aadj;
+            dval(aadj1) = dsign ? aadj : -aadj;
 #ifdef Check_FLT_ROUNDS
             switch (Rounding) {
               case 2: /* towards +infinity */
@@ -2825,7 +2833,7 @@
             }
 #else
             if (Flt_Rounds == 0)
-                aadj1 += 0.5;
+                dval(aadj1) += 0.5;
 #endif /*Check_FLT_ROUNDS*/
         }
         y = word0(rv) & Exp_mask;
@@ -2835,7 +2843,7 @@
         if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
             dval(rv0) = dval(rv);
             word0(rv) -= P*Exp_msk1;
-            adj = aadj1 * ulp(dval(rv));
+            adj = dval(aadj1) * ulp(dval(rv));
             dval(rv) += adj;
             if ((word0(rv) & Exp_mask) >=
                     Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
@@ -2855,11 +2863,11 @@
                     if ((z = aadj) <= 0)
                         z = 1;
                     aadj = z;
-                    aadj1 = dsign ? aadj : -aadj;
+                    dval(aadj1) = dsign ? aadj : -aadj;
                 }
                 word0(aadj1) += (2*P+1)*Exp_msk1 - y;
             }
-            adj = aadj1 * ulp(dval(rv));
+            adj = dval(aadj1) * ulp(dval(rv));
             dval(rv) += adj;
 #else
 #ifdef Sudden_Underflow
@@ -3170,7 +3178,7 @@
  */
 
 char *
-dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
+dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve)
 {
  /* Arguments ndigits, decpt, sign are similar to those
     of ecvt and fcvt; trailing zeros are suppressed from
@@ -3215,7 +3223,8 @@
     ULong x;
 #endif
     Bigint *b, *b1, *delta, *mlo, *mhi, *S;
-    double d2, ds, eps;
+    double ds;
+    double_u d, d2, eps;
     char *s, *s0;
 #ifdef Honor_FLT_ROUNDS
     int rounding;
@@ -3224,6 +3233,8 @@
     int inexact, oldinexact;
 #endif
 
+    dval(d) = d_;
+
 #ifndef MULTIPLE_THREADS
     if (dtoa_result) {
         freedtoa(dtoa_result);
Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog	(revision 28152)
+++ ruby_1_8_6/ChangeLog	(revision 28153)
@@ -1,3 +1,7 @@
+Fri Jun 4 5:57:00 2010 Kirk Haines <khaines@r...>
+
+	* util.c: Backport #2392 [ruby-core:26868]; backport of r23353 which suppresses a strict-aliasing warning in gcc-4.4.x -O2.
+
 Thu May 26 02:15:00 2010 Kirk Haines <khaines@r...>
 
 	* signal.c: Bug #911 [ruby-core:20723]; this problem exists because Resolv::ResolvTimeout has Interrupt in its ancestry, and Interrupt, which descends from Signal, still used Signal's initialize() method, which requires an argument. Interrupt, however, should not require an argument. This is a backport of r12226 on the 1.8.7 branch, which fixed this problem.
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h	(revision 28152)
+++ ruby_1_8_6/version.h	(revision 28153)
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.6"
-#define RUBY_RELEASE_DATE "2010-05-27"
+#define RUBY_RELEASE_DATE "2010-06-04"
 #define RUBY_VERSION_CODE 186
-#define RUBY_RELEASE_CODE 20100527
-#define RUBY_PATCHLEVEL 403
+#define RUBY_RELEASE_CODE 20100604
+#define RUBY_PATCHLEVEL 404
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 6
 #define RUBY_RELEASE_YEAR 2010
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 27
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 4
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];

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

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