[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kjs
From:       Bernhard Rosenkraenzer <bero () arklinux ! org>
Date:       2009-04-28 10:28:51
Message-ID: 1240914531.343712.19872.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 960321 by bero:

Fix crash when built with gcc 4.4 without -fno-strict-aliasing

Details included in the bug report.

BUG:189809


 M  +26 -147   dtoa.cpp  


--- trunk/KDE/kdelibs/kjs/dtoa.cpp #960320:960321
@@ -203,11 +203,7 @@
 #endif
 
 #ifdef MALLOC
-#ifdef KR_headers
-extern char *MALLOC();
-#else
 extern void *MALLOC(size_t);
-#endif
 #else
 #define MALLOC malloc
 #endif
@@ -277,12 +273,8 @@
 #endif
 
 #ifndef CONST
-#ifdef KR_headers
-#define CONST /* blank */
-#else
 #define CONST const
 #endif
-#endif
 
 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
@@ -290,37 +282,19 @@
 
 typedef union { double d; ULong L[2]; } U;
 
-#ifdef YES_ALIAS
-#define dval(x) x
+#define dval(x) (x).d
 #ifdef IEEE_8087
-#define word0(x) ((ULong *)&x)[1]
-#define word1(x) ((ULong *)&x)[0]
+#define word0(x) (x).L[1]
+#define word1(x) (x).L[0]
 #else
-#define word0(x) ((ULong *)&x)[0]
-#define word1(x) ((ULong *)&x)[1]
+#define word0(x) (x).L[0]
+#define word1(x) (x).L[1]
 #endif
-#else
-#ifdef IEEE_8087
-#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
- * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
  */
-#if defined(IEEE_8087) + defined(VAX)
-#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
-((unsigned short *)a)[0] = (unsigned short)c, a++)
-#else
-#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
-((unsigned short *)a)[1] = (unsigned short)c, a++)
-#endif
+#define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
 
 /* #define P DBL_MANT_DIG */
 /* Ten_pmax = floor(P*log(2)/log(5)) */
@@ -444,11 +418,7 @@
 #ifdef RND_PRODQUOT
 #define rounded_product(a,b) a = rnd_prod(a, b)
 #define rounded_quotient(a,b) a = rnd_quot(a, b)
-#ifdef KR_headers
-extern double rnd_prod(), rnd_quot();
-#else
 extern double rnd_prod(double, double), rnd_quot(double, double);
-#endif
 #else
 #define rounded_product(a,b) a *= b
 #define rounded_quotient(a,b) a /= b
@@ -461,11 +431,7 @@
 #define Pack_32
 #endif
 
-#ifdef KR_headers
-#define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)
-#else
 #define FFFFFFFF 0xffffffffUL
-#endif
 
 #ifdef NO_LONG_LONG
 #undef ULLong
@@ -506,11 +472,7 @@
 
  static Bigint *
 Balloc
-#ifdef KR_headers
-	(k) int k;
-#else
 	(int k)
-#endif
 {
 	int x;
 	Bigint *rv;
@@ -546,11 +508,7 @@
 
  static void
 Bfree
-#ifdef KR_headers
-	(v) Bigint *v;
-#else
 	(Bigint *v)
-#endif
 {
 	if (v) {
 		ACQUIRE_DTOA_LOCK(0);
@@ -565,11 +523,7 @@
 
  static Bigint *
 multadd
-#ifdef KR_headers
-	(b, m, a) Bigint *b; int m, a;
-#else
 	(Bigint *b, int m, int a)	/* multiply by m and add a */
-#endif
 {
 	int i, wds;
 #ifdef ULLong
@@ -622,11 +576,7 @@
 
  static Bigint *
 s2b
-#ifdef KR_headers
-	(s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9;
-#else
 	(CONST char *s, int nd0, int nd, ULong y9)
-#endif
 {
 	Bigint *b;
 	int i, k;
@@ -660,11 +610,7 @@
 
  static int
 hi0bits
-#ifdef KR_headers
-	(x) register ULong x;
-#else
 	(register ULong x)
-#endif
 {
 	register int k = 0;
 
@@ -694,11 +640,7 @@
 
  static int
 lo0bits
-#ifdef KR_headers
-	(y) ULong *y;
-#else
 	(ULong *y)
-#endif
 {
 	register int k;
 	register ULong x = *y;
@@ -742,11 +684,7 @@
 
  static Bigint *
 i2b
-#ifdef KR_headers
-	(i) int i;
-#else
 	(int i)
-#endif
 {
 	Bigint *b;
 
@@ -758,11 +696,7 @@
 
  static Bigint *
 mult
-#ifdef KR_headers
-	(a, b) Bigint *a, *b;
-#else
 	(Bigint *a, Bigint *b)
-#endif
 {
 	Bigint *c;
 	int k, wa, wb, wc;
@@ -870,11 +804,7 @@
 
  static Bigint *
 pow5mult
-#ifdef KR_headers
-	(b, k) Bigint *b; int k;
-#else
 	(Bigint *b, int k)
-#endif
 {
 	Bigint *b1, *p5, *p51;
 	int i;
@@ -927,11 +857,7 @@
 
  static Bigint *
 lshift
-#ifdef KR_headers
-	(b, k) Bigint *b; int k;
-#else
 	(Bigint *b, int k)
-#endif
 {
 	int i, k1, n, n1;
 	Bigint *b1;
@@ -987,11 +913,7 @@
 
  static int
 cmp
-#ifdef KR_headers
-	(a, b) Bigint *a, *b;
-#else
 	(Bigint *a, Bigint *b)
-#endif
 {
 	ULong *xa, *xa0, *xb, *xb0;
 	int i, j;
@@ -1021,11 +943,7 @@
 
  static Bigint *
 diff
-#ifdef KR_headers
-	(a, b) Bigint *a, *b;
-#else
 	(Bigint *a, Bigint *b)
-#endif
 {
 	Bigint *c;
 	int i, wa, wb;
@@ -1115,15 +1033,12 @@
 
  static double
 ulp
-#ifdef KR_headers
-	(x) double x;
-#else
-	(double x)
-#endif
+	(double dx)
 {
 	register Long L;
-	double a;
+	U x, a;
 
+	dval(x) = dx;
 	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
 #ifndef Avoid_Underflow
 #ifndef Sudden_Underflow
@@ -1157,15 +1072,11 @@
 
  static double
 b2d
-#ifdef KR_headers
-	(a, e) Bigint *a; int *e;
-#else
 	(Bigint *a, int *e)
-#endif
 {
 	ULong *xa, *xa0, w, y, z;
 	int k;
-	double d;
+	U d;
 #ifdef VAX
 	ULong d0, d1;
 #else
@@ -1227,12 +1138,9 @@
 
  static Bigint *
 d2b
-#ifdef KR_headers
-	(d, e, bits) double d; int *e, *bits;
-#else
-	(double d, int *e, int *bits)
-#endif
+	(double dd, int *e, int *bits)
 {
+	U d;
 	Bigint *b;
 	int de, k;
 	ULong *x, y, z;
@@ -1241,6 +1149,9 @@
 #endif
 #ifdef VAX
 	ULong d0, d1;
+#endif
+	dval(d) = dd;
+#ifdef VAX
 	d0 = word0(d) >> 16 | word0(d) << 16;
 	d1 = word1(d) >> 16 | word1(d) << 16;
 #else
@@ -1365,13 +1276,9 @@
 
  static double
 ratio
-#ifdef KR_headers
-	(a, b) Bigint *a, *b;
-#else
 	(Bigint *a, Bigint *b)
-#endif
 {
-	double da, db;
+	U da, db;
 	int k, ka, kb;
 
 	dval(da) = b2d(a, &ka);
@@ -1457,11 +1364,7 @@
 
  static int
 match
-#ifdef KR_headers
-	(sp, t) char **sp, *t;
-#else
 	(CONST char **sp, CONST char *t)
-#endif
 {
 	int c, d;
 	CONST char *s = *sp;
@@ -1479,11 +1382,7 @@
 #ifndef No_Hex_NaN
  static void
 hexnan
-#ifdef KR_headers
-	(rvp, sp) double *rvp; CONST char **sp;
-#else
-	(double *rvp, CONST char **sp)
-#endif
+	(U *rvp, CONST char **sp)
 {
 	ULong c, x[2];
 	CONST char *s;
@@ -1533,11 +1432,7 @@
 
  double
 strtod
-#ifdef KR_headers
-	(s00, se) CONST char *s00; char **se;
-#else
 	(CONST char *s00, char **se)
-#endif
 {
 #ifdef Avoid_Underflow
 	int scale;
@@ -1545,7 +1440,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, aadj1, adj;
+	U aadj2, rv, rv0;
 	Long L;
 	ULong y, z;
 	Bigint *bb = NULL, *bb1 = NULL, *bd = NULL, *bd0 = NULL, *bs = NULL, *delta = NULL;
@@ -2306,7 +2202,9 @@
 					aadj = z;
 					aadj1 = dsign ? aadj : -aadj;
 					}
-				word0(aadj1) += (2*P+1)*Exp_msk1 - y;
+				dval(aadj2) = aadj1;
+				word0(aadj2) += (2*P+1)*Exp_msk1 - y;
+				aadj1 = dval(aadj2);
 				}
 			adj = aadj1 * ulp(dval(rv));
 			dval(rv) += adj;
@@ -2423,11 +2321,7 @@
 
  static int
 quorem
-#ifdef KR_headers
-	(b, S) Bigint *b, *S;
-#else
 	(Bigint *b, Bigint *S)
-#endif
 {
 	int n;
 	ULong *bx, *bxe, q, *sx, *sxe;
@@ -2544,11 +2438,7 @@
 #endif
 
  static char *
-#ifdef KR_headers
-rv_alloc(i) int i;
-#else
 rv_alloc(int i)
-#endif
 {
 	int j, k, *r;
 
@@ -2567,11 +2457,7 @@
 	}
 
  static char *
-#ifdef KR_headers
-nrv_alloc(s, rve, n) char *s, **rve; int n;
-#else
 nrv_alloc(CONST char *s, char **rve, int n)
-#endif
 {
 	char *rv, *t;
 
@@ -2589,11 +2475,7 @@
  */
 
  void
-#ifdef KR_headers
-freedtoa(s) char *s;
-#else
 freedtoa(char *s)
-#endif
 {
 	Bigint *b = (Bigint *)((int *)s - 1);
 	b->maxwds = 1 << (b->k = *(int*)b);
@@ -2640,12 +2522,7 @@
 
  char *
 dtoa
-#ifdef KR_headers
-	(d, mode, ndigits, decpt, sign, rve)
-	double d; int mode, ndigits, *decpt, *sign; char **rve;
-#else
-	(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
-#endif
+	(double dd, 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
@@ -2690,7 +2567,8 @@
 	ULong x;
 #endif
 	Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S;
-	double d2, ds, eps;
+	U d, d2, eps;
+	double ds;
 	char *s, *s0;
 #ifdef Honor_FLT_ROUNDS
 	int rounding;
@@ -2706,6 +2584,7 @@
 		}
 #endif
 
+	dval(d) = dd;
 	if (word0(d) & Sign_bit) {
 		/* set sign for everything, including 0's and NaNs */
 		*sign = 1;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic