trying to avoid bug #72150 which was apparently caused by a gcc bug (or a
* xpath.c: trying to avoid bug #72150 which was apparently
caused by a gcc bug (or a processor problem) as detailed
at http://veillard.com/gcc.bug
Daniel
diff --git a/xpath.c b/xpath.c
index 6930812..5baacf0 100644
--- a/xpath.c
+++ b/xpath.c
@@ -6779,7 +6779,7 @@
double
xmlXPathStringEvalNumber(const xmlChar *str) {
const xmlChar *cur = str;
- double ret = 0.0;
+ double ret;
double mult = 1;
int ok = 0;
int isneg = 0;
@@ -6787,6 +6787,7 @@
int is_exponent_negative = 0;
#ifdef __GNUC__
unsigned long tmp = 0;
+ double temp;
#endif
while (IS_BLANK(*cur)) cur++;
@@ -6800,15 +6801,20 @@
#ifdef __GNUC__
/*
- * tmp is a workaround against a gcc compiler bug
+ * tmp/temp is a workaround against a gcc compiler bug
+ * http://veillard.com/gcc.bug
*/
+ ret = 0;
while ((*cur >= '0') && (*cur <= '9')) {
- tmp = tmp * 10 + (*cur - '0');
+ ret = ret * 10;
+ tmp = (*cur - '0');
ok = 1;
cur++;
+ temp = (double) tmp;
+ ret = ret + temp;
}
- ret = (double) tmp;
#else
+ ret = 0;
while ((*cur >= '0') && (*cur <= '9')) {
ret = ret * 10 + (*cur - '0');
ok = 1;
@@ -6862,23 +6868,40 @@
{
double ret = 0.0;
double mult = 1;
- int ok = 0, tmp = 0;
+ int ok = 0;
int exponent = 0;
int is_exponent_negative = 0;
+#ifdef __GNUC__
+ unsigned long tmp = 0;
+ double temp;
+#endif
CHECK_ERROR;
if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) {
XP_ERROR(XPATH_NUMBER_ERROR);
}
+#ifdef __GNUC__
/*
- * Try to work around a gcc optimizer bug
+ * tmp/temp is a workaround against a gcc compiler bug
+ * http://veillard.com/gcc.bug
*/
+ ret = 0;
while ((CUR >= '0') && (CUR <= '9')) {
- tmp = tmp * 10 + (CUR - '0');
+ ret = ret * 10;
+ tmp = (CUR - '0');
ok = 1;
NEXT;
+ temp = (double) tmp;
+ ret = ret + temp;
}
- ret = (double) tmp;
+#else
+ ret = 0;
+ while ((CUR >= '0') && (CUR <= '9')) {
+ ret = ret * 10 + (CUR - '0');
+ ok = 1;
+ NEXT;
+ }
+#endif
if (CUR == '.') {
NEXT;
if (((CUR < '0') || (CUR > '9')) && (!ok)) {