Hi Joe,

It seems like your patch doesn't really fix anything. How is rounding to LONG_MAX/LONG_MIN any better?
Maybe you can explain in more detail what this gcc bug you are hitting is?
Thanks,
Andi


At 01:25 PM 8/27/2004 +0100, Joe Orton wrote:
The DVAL_TO_LVAL macro is quite weird, I'm not sure exactly what it's
supposed to be doing but it probably isn't doing it. If the integral
part of d is outside the range of a long, the conversion has undefined
behaviour by the C99 standard; an explicit cast makes no difference
AFAICT.

GCC on IA64 does wierd things with this macro, though I think there's a
GCC bug involved there too.  This fixes the macro to have well-defined
behaviour for all values of 'd', and avoids triggering the GCC bug on
IA64 to boot (both PHP users on that platform will be happy):

Index: Zend/zend_operators.c
===================================================================
RCS file: /repository/ZendEngine2/zend_operators.c,v
retrieving revision 1.194
diff -u -r1.194 zend_operators.c
--- Zend/zend_operators.c       19 Jul 2004 07:19:02 -0000      1.194
+++ Zend/zend_operators.c       27 Aug 2004 12:15:12 -0000
@@ -183,7 +183,15 @@
        }


-#define DVAL_TO_LVAL(d, l) (l) = (d) > LONG_MAX ? (unsigned long) (d) : (long) (d)
+#define DVAL_TO_LVAL(d, l) do { \
+ if ((d) > LONG_MAX) { \
+ l = LONG_MAX; \
+ } else if ((d) < LONG_MIN) { \
+ l = LONG_MIN; \
+ } else { \
+ l = (d); \
+ } \
+} while (0)


#define zendi_convert_to_long(op, holder, result) \
if (op==result) { \


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php



Reply via email to