summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-03 22:58:28 +0000
committerwyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-03 22:58:28 +0000
commit1e86a6b9ca71dbf12cab2795410a0ca3f0cd5b3a (patch)
tree6b0a35e1dde62f5eb4f0825701ce617cfd91539f
parent5b22d85363ae370f92f629b5278aa7bf6bc7e58e (diff)
Backport #2392 [ruby-core:26868]; backport of r23353 which suppresses a strict-aliasing warning in gcc-4.4.x -O2.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@28153 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--util.c77
-rw-r--r--version.h10
3 files changed, 53 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 3c9fd550f0..ba93fd9706 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Jun 4 5:57:00 2010 Kirk Haines <khaines@ruby-lang.org>
+
+ * 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@ruby-lang.org>
* 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.
diff --git a/util.c b/util.c
index 13c86eaf18..283a87b57e 100644
--- a/util.c
+++ b/util.c
@@ -951,23 +951,25 @@ Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be define
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]
-#else
-#define word0(x) ((ULong *)&x)[0]
-#define word1(x) ((ULong *)&x)[1]
-#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
+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
+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
/* The following definition of Storeinc is appropriate for MIPS processors.
@@ -1697,10 +1699,11 @@ diff(Bigint *a, Bigint *b)
}
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 @@ b2d(Bigint *a, int *e)
{
ULong *xa, *xa0, w, y, z;
int k;
- double d;
+ double_u d;
#ifdef VAX
ULong d0, d1;
#else
@@ -1799,8 +1802,9 @@ ret_d:
}
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 @@ d2b(double d, int *e, int *bits)
#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 @@ d2b(double d, int *e, int *bits)
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 @@ ruby_strtod(const char *s00, char **se)
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 @@ drop_down:
}
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 @@ drop_down:
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 @@ drop_down:
}
#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 @@ drop_down:
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 @@ drop_down:
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 @@ freedtoa(char *s)
*/
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 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
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 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
int inexact, oldinexact;
#endif
+ dval(d) = d_;
+
#ifndef MULTIPLE_THREADS
if (dtoa_result) {
freedtoa(dtoa_result);
diff --git a/version.h b/version.h
index 7229ab47be..d06e46f9e4 100644
--- a/version.h
+++ b/version.h
@@ -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[];