helly Fri Mar 26 20:17:07 2004 EDT
Added files: (Branch: PHP_4_3)
/php-src/ext/standard/tests/math bug27646.phpt
Modified files:
/php-src/ext/standard config.m4 basic_functions.c basic_functions.h
var_unserializer.re
Log:
MFH: bugfix #27646
http://cvs.php.net/diff.php/php-src/ext/standard/config.m4?r1=1.47.2.5&r2=1.47.2.6&ty=u
Index: php-src/ext/standard/config.m4
diff -u php-src/ext/standard/config.m4:1.47.2.5 php-src/ext/standard/config.m4:1.47.2.6
--- php-src/ext/standard/config.m4:1.47.2.5 Wed Aug 27 13:57:31 2003
+++ php-src/ext/standard/config.m4 Fri Mar 26 20:17:06 2004
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.47.2.5 2003/08/27 17:57:31 sniper Exp $ -*- sh -*-
+dnl $Id: config.m4,v 1.47.2.6 2004/03/27 01:17:06 helly Exp $ -*- sh -*-
divert(3)dnl
@@ -263,6 +263,71 @@
AC_DEFINE(ENABLE_CHROOT_FUNC, 1, [Whether to enable chroot() function])
fi
+AC_CHECK_FUNCS(fpclass isinf isnan)
+
+AC_CACHE_CHECK(whether atof() accepts NAN, ac_cv_atof_accept_nan,[
+ AC_TRY_RUN([
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ISNAN
+#define zend_isnan(a) isnan(a)
+#elif defined(NAN)
+#define zend_isnan(a) (((a)==NAN)?1:0)
+#elif defined(HAVE_FPCLASS)
+#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
+#else
+#define zend_isnan(a) 0
+#endif
+
+int main(int argc, char** argv)
+{
+ return zend_isnan(atof("NAN")) ? 0 : 1;
+}
+ ],[
+ ac_cv_atof_accept_nan=yes
+ ],[
+ ac_cv_atof_accept_nan=no
+ ],[
+ ac_cv_atof_accept_nan=no
+ ])
+ if test "$ac_cv_atof_accept_nan" = "yes"; then
+ AC_DEFINE([HAVE_ATOF_ACCEPTS_NAN], 1, [whether atof() accepts NAN])
+ fi
+])
+
+AC_CACHE_CHECK(whether atof() accepts INF, ac_cv_atof_accept_inf,[
+ AC_TRY_RUN([
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ISINF
+#define zend_isinf(a) isinf(a)
+#elif defined(INFINITY)
+/* Might not work, but is required by ISO C99 */
+#define zend_isinf(a) (((a)==INFINITY)?1:0)
+#elif defined(HAVE_FPCLASS)
+#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
+#else
+#define zend_isinf(a) 0
+#endif
+
+int main(int argc, char** argv)
+{
+ return zend_isinf(atof("INF")) && zend_isinf(atof("-INF")) ? 0 : 1;
+}
+ ],[
+ ac_cv_atof_accept_inf=yes
+ ],[
+ ac_cv_atof_accept_inf=no
+ ],[
+ ac_cv_atof_accept_inf=no
+ ])
+ if test "$ac_cv_atof_accept_inf" = "yes"; then
+ AC_DEFINE([HAVE_ATOF_ACCEPTS_INF], 1, [whether atof() accepts INF])
+ fi
+])
+
PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.c
crypt.c \
cyr_convert.c datetime.c dir.c dl.c dns.c exec.c file.c
filestat.c \
flock_compat.c formatted_print.c fsock.c head.c html.c
image.c \
http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.c?r1=1.543.2.32&r2=1.543.2.33&ty=u
Index: php-src/ext/standard/basic_functions.c
diff -u php-src/ext/standard/basic_functions.c:1.543.2.32
php-src/ext/standard/basic_functions.c:1.543.2.33
--- php-src/ext/standard/basic_functions.c:1.543.2.32 Fri Mar 12 12:42:09 2004
+++ php-src/ext/standard/basic_functions.c Fri Mar 26 20:17:06 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.c,v 1.543.2.32 2004/03/12 17:42:09 rasmus Exp $ */
+/* $Id: basic_functions.c,v 1.543.2.33 2004/03/27 01:17:06 helly Exp $ */
#include "php.h"
#include "php_streams.h"
@@ -996,6 +996,35 @@
}
+#define PHP_DOUBLE_INFINITY_HIGH 0x7ff00000
+#define PHP_DOUBLE_QUIET_NAN_HIGH 0xfff80000
+
+PHPAPI double php_get_nan()
+{
+#if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) ||
defined(__alpha)
+ double val;
+ ((php_uint32*)&val)[1] = PHP_DOUBLE_QUIET_NAN_HIGH;
+ ((php_uint32*)&val)[0] = 0;
+ return val;
+#else
+ /* hope the target platform is ISO-C compliant */
+ return atof("NAN");
+#endif
+}
+
+PHPAPI double php_get_inf()
+{
+#if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) ||
defined(__alpha)
+ double val;
+ ((php_uint32*)&val)[1] = PHP_DOUBLE_INFINITY_HIGH;
+ ((php_uint32*)&val)[0] = 0;
+ return val;
+#else
+ /* hope the target platform is ISO-C compliant */
+ return atof("INF");
+#endif
+}
+
PHP_MINIT_FUNCTION(basic)
{
#ifdef ZTS
@@ -1027,6 +1056,8 @@
REGISTER_MATH_CONSTANT(M_2_SQRTPI);
REGISTER_MATH_CONSTANT(M_SQRT2);
REGISTER_MATH_CONSTANT(M_SQRT1_2);
+ REGISTER_DOUBLE_CONSTANT("INF", php_get_inf(), CONST_CS | CONST_PERSISTENT);
+ REGISTER_DOUBLE_CONSTANT("NAN", php_get_nan(), CONST_CS | CONST_PERSISTENT);
#if ENABLE_TEST_CLASS
test_class_startup();
http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.h?r1=1.109.2.1&r2=1.109.2.2&ty=u
Index: php-src/ext/standard/basic_functions.h
diff -u php-src/ext/standard/basic_functions.h:1.109.2.1
php-src/ext/standard/basic_functions.h:1.109.2.2
--- php-src/ext/standard/basic_functions.h:1.109.2.1 Tue Dec 31 11:35:25 2002
+++ php-src/ext/standard/basic_functions.h Fri Mar 26 20:17:06 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.h,v 1.109.2.1 2002/12/31 16:35:25 sebastian Exp $ */
+/* $Id: basic_functions.h,v 1.109.2.2 2004/03/27 01:17:06 helly Exp $ */
#ifndef BASIC_FUNCTIONS_H
#define BASIC_FUNCTIONS_H
@@ -211,4 +211,7 @@
#define SAFE_MODE_PROTECTED_ENV_VARS "LD_LIBRARY_PATH"
#define SAFE_MODE_ALLOWED_ENV_VARS "PHP_"
+PHPAPI double php_get_nan();
+PHPAPI double php_get_inf();
+
#endif /* BASIC_FUNCTIONS_H */
http://cvs.php.net/diff.php/php-src/ext/standard/var_unserializer.re?r1=1.11.4.2&r2=1.11.4.3&ty=u
Index: php-src/ext/standard/var_unserializer.re
diff -u php-src/ext/standard/var_unserializer.re:1.11.4.2
php-src/ext/standard/var_unserializer.re:1.11.4.3
--- php-src/ext/standard/var_unserializer.re:1.11.4.2 Wed Sep 3 12:26:42 2003
+++ php-src/ext/standard/var_unserializer.re Fri Mar 26 20:17:06 2004
@@ -1,3 +1,4 @@
+
#include "php.h"
#include "ext/standard/php_var.h"
#include "php_incomplete_class.h"
@@ -275,6 +276,23 @@
return 1;
}
+"d:" ("NAN" | "-"? "INF") ";" {
+ *p = YYCURSOR;
+ INIT_PZVAL(*rval);
+#if defined(HAVE_ATOF_ACCEPTS_NAN) && defined(HAVE_ATOF_ACCEPTS_INF)
+ ZVAL_DOUBLE(*rval, atof(start + 2));
+#else
+ if (!strncmp(start + 2, "NAN", 3)) {
+ ZVAL_DOUBLE(*rval, php_get_nan());
+ } else if (!strncmp(start + 2, "INF", 3)) {
+ ZVAL_DOUBLE(*rval, php_get_inf());
+ } else if (!strncmp(start + 2, "-INF", 4)) {
+ ZVAL_DOUBLE(*rval, -php_get_inf());
+ }
+#endif
+ return 1;
+}
+
"d:" (iv | nv | nvexp) ";" {
*p = YYCURSOR;
INIT_PZVAL(*rval);
http://cvs.php.net/co.php/php-src/ext/standard/tests/math/bug27646.phpt?r=1.1&p=1
Index: php-src/ext/standard/tests/math/bug27646.phpt
+++ php-src/ext/standard/tests/math/bug27646.phpt
--TEST--
Bug #27646 (Cannot serialize/unserialize non-finite numeric values)
--FILE--
<?php
$f=-(float)INF;
var_dump($f);
var_dump(serialize($f));
var_dump(unserialize(serialize($f)));
$f=(float)INF;
var_dump($f);
var_dump(serialize($f));
var_dump(unserialize(serialize($f)));
$f=(float)NAN;
var_dump($f);
var_dump(serialize($f));
var_dump(unserialize(serialize($f)));
?>
--EXPECT--
float(-INF)
string(7) "d:-INF;"
float(-INF)
float(INF)
string(6) "d:INF;"
float(INF)
float(NAN)
string(6) "d:NAN;"
float(NAN)
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php