summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/Zend.m4137
-rw-r--r--Zend/zend_portability.h46
-rw-r--r--ext/intl/common/common_date.cpp14
-rw-r--r--ext/standard/basic_functions.c35
-rw-r--r--ext/standard/config.m4137
-rw-r--r--ext/standard/math.c7
-rw-r--r--ext/standard/var_unserializer.c987
-rw-r--r--ext/standard/var_unserializer.re7
8 files changed, 683 insertions, 687 deletions
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index 9d3b46a755..a1c1d3b07b 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -466,3 +466,140 @@ else
HAVE_GCC_GLOBAL_REGS=no
fi
AC_MSG_RESULT($ZEND_GCC_GLOBAL_REGS)
+
+dnl
+dnl Check if atof() accepts NAN
+dnl
+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(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
+
+dnl
+dnl Check if atof() accepts INF
+dnl
+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
+
+dnl
+dnl Check if HUGE_VAL == INF
+dnl
+AC_CACHE_CHECK(whether HUGE_VAL == INF, ac_cv_huge_val_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(HUGE_VAL) ? 0 : 1;
+}
+],[
+ ac_cv_huge_val_inf=yes
+],[
+ ac_cv_huge_val_inf=no
+],[
+ ac_cv_huge_val_inf=yes
+])])
+dnl This is the most probable fallback so we assume yes in case of cross compile.
+if test "$ac_cv_huge_val_inf" = "yes"; then
+ AC_DEFINE([HAVE_HUGE_VAL_INF], 1, [whether HUGE_VAL == INF])
+fi
+
+dnl
+dnl Check if HUGE_VAL + -HUGEVAL == NAN
+dnl
+AC_CACHE_CHECK(whether HUGE_VAL + -HUGEVAL == NAN, ac_cv_huge_val_nan,[
+AC_TRY_RUN([
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ISNAN
+#define zend_isnan(a) isnan(a)
+#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)
+{
+#if defined(__sparc__) && !(__GNUC__ >= 3)
+ /* prevent bug #27830 */
+ return 1;
+#else
+ return zend_isnan(HUGE_VAL + -HUGE_VAL) ? 0 : 1;
+#endif
+}
+],[
+ ac_cv_huge_val_nan=yes
+],[
+ ac_cv_huge_val_nan=no
+],[
+ ac_cv_huge_val_nan=yes
+])])
+dnl This is the most probable fallback so we assume yes in case of cross compile.
+if test "$ac_cv_huge_val_nan" = "yes"; then
+ AC_DEFINE([HAVE_HUGE_VAL_NAN], 1, [whether HUGE_VAL + -HUGEVAL == NAN])
+fi
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index 298dfb53fa..ff12d93269 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -53,6 +53,7 @@
#include <stdio.h>
#include <assert.h>
+#include <math.h>
#ifdef HAVE_UNIX_H
# include <unix.h>
@@ -420,6 +421,51 @@ char *alloca();
#undef MAX
#define MAX(a, b) (((a)>(b))?(a):(b))
#define MIN(a, b) (((a)<(b))?(a):(b))
+
+/* We always define a function, even if there's a macro or expression we could
+ * alias, so that using it in contexts where we can't make function calls
+ * won't fail to compile on some machines and not others.
+ */
+static zend_always_inline double _zend_get_inf(void) /* {{{ */
+{
+#ifdef INFINITY
+ return INFINITY;
+#elif HAVE_HUGE_VAL_INF
+ return HUGE_VAL;
+#elif defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha)
+# define _zend_DOUBLE_INFINITY_HIGH 0x7ff00000
+ double val = 0.0;
+ ((uint32_t*)&val)[1] = _zend_DOUBLE_INFINITY_HIGH;
+ ((uint32_t*)&val)[0] = 0;
+ return val;
+#elif HAVE_ATOF_ACCEPTS_INF
+ return atof("INF");
+#else
+ return 1.0/0.0;
+#endif
+} /* }}} */
+#define ZEND_INFINITY (_zend_get_inf())
+
+static zend_always_inline double _zend_get_nan(void) /* {{{ */
+{
+#ifdef NAN
+ return NAN;
+#elif HAVE_HUGE_VAL_NAN
+ return HUGE_VAL + -HUGE_VAL;
+#elif defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha)
+# define _zend_DOUBLE_QUIET_NAN_HIGH 0xfff80000
+ double val = 0.0;
+ ((uint32_t*)&val)[1] = _zend_DOUBLE_QUIET_NAN_HIGH;
+ ((uint32_t*)&val)[0] = 0;
+ return val;
+#elif HAVE_ATOF_ACCEPTS_NAN
+ return atof("NAN");
+#else
+ return 0.0/0.0;
+#endif
+} /* }}} */
+#define ZEND_NAN (_zend_get_nan())
+
#define ZEND_STRL(str) (str), (sizeof(str)-1)
#define ZEND_STRS(str) (str), (sizeof(str))
#define ZEND_NORMALIZE_BOOL(n) \
diff --git a/ext/intl/common/common_date.cpp b/ext/intl/common/common_date.cpp
index f1bf75ab0f..2357a03940 100644
--- a/ext/intl/common/common_date.cpp
+++ b/ext/intl/common/common_date.cpp
@@ -25,13 +25,7 @@ extern "C" {
#include <ext/date/php_date.h>
}
-#ifndef INFINITY
-#define INFINITY (DBL_MAX+DBL_MAX)
-#endif
-
-#ifndef NAN
-#define NAN (INFINITY-INFINITY)
-#endif
+#include "zend_portability.h"
/* {{{ timezone_convert_datetimezone
* The timezone in DateTime and DateTimeZone is not unified. */
@@ -118,7 +112,7 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
}
if (millis) {
- *millis = NAN;
+ *millis = ZEND_NAN;
}
if (tz) {
*tz = NULL;
@@ -173,13 +167,13 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err, const char *func)
{
- double rv = NAN;
+ double rv = ZEND_NAN;
zend_long lv;
int type;
char *message;
if (err && U_FAILURE(err->code)) {
- return NAN;
+ return ZEND_NAN;
}
switch (Z_TYPE_P(z)) {
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index d528e51908..af66d1e0a6 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -49,6 +49,8 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
#include "zend_language_scanner.h"
#include <zend_language_parser.h>
+#include "zend_portability.h"
+
#include <stdarg.h>
#include <stdlib.h>
#include <math.h>
@@ -3526,40 +3528,15 @@ static void basic_globals_dtor(php_basic_globals *basic_globals_p) /* {{{ */
}
/* }}} */
-#define PHP_DOUBLE_INFINITY_HIGH 0x7ff00000
-#define PHP_DOUBLE_QUIET_NAN_HIGH 0xfff80000
-
PHPAPI double php_get_nan(void) /* {{{ */
{
-#if HAVE_HUGE_VAL_NAN
- return HUGE_VAL + -HUGE_VAL;
-#elif defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha)
- double val = 0.0;
- ((uint32_t*)&val)[1] = PHP_DOUBLE_QUIET_NAN_HIGH;
- ((uint32_t*)&val)[0] = 0;
- return val;
-#elif HAVE_ATOF_ACCEPTS_NAN
- return atof("NAN");
-#else
- return 0.0/0.0;
-#endif
+ return ZEND_NAN;
}
/* }}} */
PHPAPI double php_get_inf(void) /* {{{ */
{
-#if HAVE_HUGE_VAL_INF
- return HUGE_VAL;
-#elif defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha)
- double val = 0.0;
- ((uint32_t*)&val)[1] = PHP_DOUBLE_INFINITY_HIGH;
- ((uint32_t*)&val)[0] = 0;
- return val;
-#elif HAVE_ATOF_ACCEPTS_INF
- return atof("INF");
-#else
- return 1.0/0.0;
-#endif
+ return ZEND_INFINITY;
}
/* }}} */
@@ -3651,8 +3628,8 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */
REGISTER_MATH_CONSTANT(M_SQRT2);
REGISTER_MATH_CONSTANT(M_SQRT1_2);
REGISTER_MATH_CONSTANT(M_SQRT3);
- REGISTER_DOUBLE_CONSTANT("INF", php_get_inf(), CONST_CS | CONST_PERSISTENT);
- REGISTER_DOUBLE_CONSTANT("NAN", php_get_nan(), CONST_CS | CONST_PERSISTENT);
+ REGISTER_DOUBLE_CONSTANT("INF", ZEND_INFINITY, CONST_CS | CONST_PERSISTENT);
+ REGISTER_DOUBLE_CONSTANT("NAN", ZEND_NAN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_UP", PHP_ROUND_HALF_UP, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_DOWN", PHP_ROUND_HALF_DOWN, CONST_CS | CONST_PERSISTENT);
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
index 824e1da479..3f2da2dc24 100644
--- a/ext/standard/config.m4
+++ b/ext/standard/config.m4
@@ -351,143 +351,6 @@ dnl
PHP_CHECK_FUNC(res_search, resolv, bind, socket)
dnl
-dnl Check if atof() accepts NAN
-dnl
-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(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
-
-dnl
-dnl Check if atof() accepts INF
-dnl
-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
-
-dnl
-dnl Check if HUGE_VAL == INF
-dnl
-AC_CACHE_CHECK(whether HUGE_VAL == INF, ac_cv_huge_val_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(HUGE_VAL) ? 0 : 1;
-}
-],[
- ac_cv_huge_val_inf=yes
-],[
- ac_cv_huge_val_inf=no
-],[
- ac_cv_huge_val_inf=yes
-])])
-dnl This is the most probable fallback so we assume yes in case of cross compile.
-if test "$ac_cv_huge_val_inf" = "yes"; then
- AC_DEFINE([HAVE_HUGE_VAL_INF], 1, [whether HUGE_VAL == INF])
-fi
-
-dnl
-dnl Check if HUGE_VAL + -HUGEVAL == NAN
-dnl
-AC_CACHE_CHECK(whether HUGE_VAL + -HUGEVAL == NAN, ac_cv_huge_val_nan,[
-AC_TRY_RUN([
-#include <math.h>
-#include <stdlib.h>
-
-#ifdef HAVE_ISNAN
-#define zend_isnan(a) isnan(a)
-#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)
-{
-#if defined(__sparc__) && !(__GNUC__ >= 3)
- /* prevent bug #27830 */
- return 1;
-#else
- return zend_isnan(HUGE_VAL + -HUGE_VAL) ? 0 : 1;
-#endif
-}
-],[
- ac_cv_huge_val_nan=yes
-],[
- ac_cv_huge_val_nan=no
-],[
- ac_cv_huge_val_nan=yes
-])])
-dnl This is the most probable fallback so we assume yes in case of cross compile.
-if test "$ac_cv_huge_val_nan" = "yes"; then
- AC_DEFINE([HAVE_HUGE_VAL_NAN], 1, [whether HUGE_VAL + -HUGEVAL == NAN])
-fi
-
-dnl
dnl Check for strptime()
dnl
AC_CACHE_CHECK(whether strptime() declaration fails, ac_cv_strptime_decl_fails,[
diff --git a/ext/standard/math.c b/ext/standard/math.c
index 83145a4dc9..7a3d9b6621 100644
--- a/ext/standard/math.c
+++ b/ext/standard/math.c
@@ -25,6 +25,7 @@
#include "php_math.h"
#include "zend_multiply.h"
#include "zend_exceptions.h"
+#include "zend_portability.h"
#include <math.h>
#include <float.h>
@@ -239,7 +240,7 @@ static double php_acosh(double x)
if (x >= 1) {
return log(x + sqrt(x * x - 1));
} else {
- return (DBL_MAX+DBL_MAX)-(DBL_MAX+DBL_MAX);
+ return ZEND_NAN;
}
# else
return(log(x + sqrt(x * x - 1)));
@@ -707,7 +708,7 @@ PHP_FUNCTION(log)
}
if (base == 1.0) {
- RETURN_DOUBLE(php_get_nan());
+ RETURN_DOUBLE(ZEND_NAN);
}
if (base <= 0.0) {
@@ -951,7 +952,7 @@ PHPAPI zend_string * _php_math_zvaltobase(zval *arg, int base)
char buf[(sizeof(double) << 3) + 1];
/* Don't try to convert +/- infinity */
- if (fvalue == HUGE_VAL || fvalue == -HUGE_VAL) {
+ if (fvalue == ZEND_INFINITY || fvalue == -ZEND_INFINITY) {
php_error_docref(NULL, E_WARNING, "Number too large");
return ZSTR_EMPTY_ALLOC();
}
diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c
index f3b997a6ef..4cf41e6eeb 100644
--- a/ext/standard/var_unserializer.c
+++ b/ext/standard/var_unserializer.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.16 */
+/* Generated by re2c 0.15.3 */
#line 1 "ext/standard/var_unserializer.re"
/*
+----------------------------------------------------------------------+
@@ -23,6 +23,7 @@
#include "php.h"
#include "ext/standard/php_var.h"
#include "php_incomplete_class.h"
+#include "zend_portability.h"
struct php_unserialize_data {
void *first;
@@ -283,7 +284,7 @@ static inline int unserialize_allowed_class(
#define YYMARKER marker
-#line 291 "ext/standard/var_unserializer.re"
+#line 292 "ext/standard/var_unserializer.re"
@@ -589,7 +590,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER)
start = cursor;
-#line 593 "ext/standard/var_unserializer.c"
+#line 594 "ext/standard/var_unserializer.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -630,506 +631,107 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER)
yych = *YYCURSOR;
switch (yych) {
case 'C':
- case 'O': goto yy4;
+ case 'O': goto yy13;
case 'N': goto yy5;
- case 'R': goto yy6;
- case 'S': goto yy7;
- case 'a': goto yy8;
- case 'b': goto yy9;
- case 'd': goto yy10;
- case 'i': goto yy11;
+ case 'R': goto yy2;
+ case 'S': goto yy10;
+ case 'a': goto yy11;
+ case 'b': goto yy6;
+ case 'd': goto yy8;
+ case 'i': goto yy7;
case 'o': goto yy12;
- case 'r': goto yy13;
- case 's': goto yy14;
- case '}': goto yy15;
- default: goto yy2;
+ case 'r': goto yy4;
+ case 's': goto yy9;
+ case '}': goto yy14;
+ default: goto yy16;
}
yy2:
- ++YYCURSOR;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == ':') goto yy95;
yy3:
-#line 959 "ext/standard/var_unserializer.re"
+#line 960 "ext/standard/var_unserializer.re"
{ return 0; }
-#line 653 "ext/standard/var_unserializer.c"
+#line 655 "ext/standard/var_unserializer.c"
yy4:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy17;
+ if (yych == ':') goto yy89;
goto yy3;
yy5:
yych = *++YYCURSOR;
- if (yych == ';') goto yy19;
+ if (yych == ';') goto yy87;
goto yy3;
yy6:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy21;
+ if (yych == ':') goto yy83;
goto yy3;
yy7:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy22;
+ if (yych == ':') goto yy77;
goto yy3;
yy8:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy23;
+ if (yych == ':') goto yy53;
goto yy3;
yy9:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy24;
+ if (yych == ':') goto yy46;
goto yy3;
yy10:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy25;
+ if (yych == ':') goto yy39;
goto yy3;
yy11:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy26;
+ if (yych == ':') goto yy32;
goto yy3;
yy12:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy27;
+ if (yych == ':') goto yy25;
goto yy3;
yy13:
yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy28;
+ if (yych == ':') goto yy17;
goto yy3;
yy14:
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych == ':') goto yy29;
- goto yy3;
-yy15:
++YYCURSOR;
-#line 953 "ext/standard/var_unserializer.re"
+#line 954 "ext/standard/var_unserializer.re"
{
/* this is the case where we have less data than planned */
php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data");
return 0; /* not sure if it should be 0 or 1 here? */
}
-#line 706 "ext/standard/var_unserializer.c"
+#line 704 "ext/standard/var_unserializer.c"
+yy16:
+ yych = *++YYCURSOR;
+ goto yy3;
yy17:
yych = *++YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy31;
+ goto yy20;
}
- if (yych == '+') goto yy30;
+ if (yych == '+') goto yy19;
yy18:
YYCURSOR = YYMARKER;
goto yy3;
yy19:
- ++YYCURSOR;
-#line 648 "ext/standard/var_unserializer.re"
- {
- *p = YYCURSOR;
- ZVAL_NULL(rval);
- return 1;
-}
-#line 724 "ext/standard/var_unserializer.c"
-yy21:
- yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy33;
- goto yy18;
- } else {
- if (yych <= '-') goto yy33;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy34;
- goto yy18;
- }
-yy22:
- yych = *++YYCURSOR;
- if (yych == '+') goto yy36;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy37;
- goto yy18;
-yy23:
- yych = *++YYCURSOR;
- if (yych == '+') goto yy39;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy40;
- goto yy18;
-yy24:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '1') goto yy42;
- goto yy18;
-yy25:
- yych = *++YYCURSOR;
- if (yych <= '/') {
- if (yych <= ',') {
- if (yych == '+') goto yy43;
- goto yy18;
- } else {
- if (yych <= '-') goto yy44;
- if (yych <= '.') goto yy45;
- goto yy18;
- }
- } else {
- if (yych <= 'I') {
- if (yych <= '9') goto yy46;
- if (yych <= 'H') goto yy18;
- goto yy48;
- } else {
- if (yych == 'N') goto yy49;
- goto yy18;
- }
- }
-yy26:
- yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy50;
- goto yy18;
- } else {
- if (yych <= '-') goto yy50;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy51;
- goto yy18;
- }
-yy27:
- yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy53;
- goto yy18;
- } else {
- if (yych <= '-') goto yy53;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy54;
- goto yy18;
- }
-yy28:
- yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy56;
- goto yy18;
- } else {
- if (yych <= '-') goto yy56;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy57;
- goto yy18;
- }
-yy29:
- yych = *++YYCURSOR;
- if (yych == '+') goto yy59;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy60;
- goto yy18;
-yy30:
yych = *++YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy31;
+ goto yy20;
}
goto yy18;
-yy31:
+yy20:
++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy31;
+ goto yy20;
}
if (yych <= '/') goto yy18;
- if (yych <= ':') goto yy62;
- goto yy18;
-yy33:
+ if (yych >= ';') goto yy18;
yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy34:
+ if (yych != '"') goto yy18;
++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy34;
- if (yych == ';') goto yy63;
- goto yy18;
-yy36:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy37:
- ++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy37;
- if (yych <= ':') goto yy65;
- goto yy18;
-yy39:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy40:
- ++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy40;
- if (yych <= ':') goto yy66;
- goto yy18;
-yy42:
- yych = *++YYCURSOR;
- if (yych == ';') goto yy67;
- goto yy18;
-yy43:
- yych = *++YYCURSOR;
- if (yych == '.') goto yy45;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy46;
- goto yy18;
-yy44:
- yych = *++YYCURSOR;
- if (yych <= '/') {
- if (yych != '.') goto yy18;
- } else {
- if (yych <= '9') goto yy46;
- if (yych == 'I') goto yy48;
- goto yy18;
- }
-yy45:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy69;
- goto yy18;
-yy46:
- ++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
- yych = *YYCURSOR;
- if (yych <= ':') {
- if (yych <= '.') {
- if (yych <= '-') goto yy18;
- goto yy69;
- } else {
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy46;
- goto yy18;
- }
- } else {
- if (yych <= 'E') {
- if (yych <= ';') goto yy71;
- if (yych <= 'D') goto yy18;
- goto yy73;
- } else {
- if (yych == 'e') goto yy73;
- goto yy18;
- }
- }
-yy48:
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy74;
- goto yy18;
-yy49:
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy75;
- goto yy18;
-yy50:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy51:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy51;
- if (yych == ';') goto yy76;
- goto yy18;
-yy53:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy54:
- ++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy54;
- if (yych <= ':') goto yy78;
- goto yy18;
-yy56:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy57:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy57;
- if (yych == ';') goto yy79;
- goto yy18;
-yy59:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy60:
- ++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy60;
- if (yych <= ':') goto yy81;
- goto yy18;
-yy62:
- yych = *++YYCURSOR;
- if (yych == '"') goto yy82;
- goto yy18;
-yy63:
- ++YYCURSOR;
-#line 597 "ext/standard/var_unserializer.re"
- {
- zend_long id;
-
- *p = YYCURSOR;
- if (!var_hash) return 0;
-
- id = parse_iv(start + 2) - 1;
- if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) {
- return 0;
- }
-
- zval_ptr_dtor(rval);
- if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) {
- ZVAL_UNDEF(rval);
- return 1;
- }
- if (Z_ISREF_P(rval_ref)) {
- ZVAL_COPY(rval, rval_ref);
- } else {
- ZVAL_NEW_REF(rval_ref, rval_ref);
- ZVAL_COPY(rval, rval_ref);
- }
-
- return 1;
-}
-#line 1000 "ext/standard/var_unserializer.c"
-yy65:
- yych = *++YYCURSOR;
- if (yych == '"') goto yy84;
- goto yy18;
-yy66:
- yych = *++YYCURSOR;
- if (yych == '{') goto yy86;
- goto yy18;
-yy67:
- ++YYCURSOR;
-#line 654 "ext/standard/var_unserializer.re"
- {
- *p = YYCURSOR;
- ZVAL_BOOL(rval, parse_iv(start + 2));
- return 1;
-}
-#line 1017 "ext/standard/var_unserializer.c"
-yy69:
- ++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
- yych = *YYCURSOR;
- if (yych <= ';') {
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy69;
- if (yych <= ':') goto yy18;
- } else {
- if (yych <= 'E') {
- if (yych <= 'D') goto yy18;
- goto yy73;
- } else {
- if (yych == 'e') goto yy73;
- goto yy18;
- }
- }
-yy71:
- ++YYCURSOR;
-#line 702 "ext/standard/var_unserializer.re"
- {
-#if SIZEOF_ZEND_LONG == 4
-use_double:
-#endif
- *p = YYCURSOR;
- ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL));
- return 1;
-}
-#line 1046 "ext/standard/var_unserializer.c"
-yy73:
- yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy88;
- goto yy18;
- } else {
- if (yych <= '-') goto yy88;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy89;
- goto yy18;
- }
-yy74:
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy91;
- goto yy18;
-yy75:
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy91;
- goto yy18;
-yy76:
- ++YYCURSOR;
-#line 660 "ext/standard/var_unserializer.re"
- {
-#if SIZEOF_ZEND_LONG == 4
- int digits = YYCURSOR - start - 3;
-
- if (start[2] == '-' || start[2] == '+') {
- digits--;
- }
-
- /* Use double for large zend_long values that were serialized on a 64-bit system */
- if (digits >= MAX_LENGTH_OF_LONG - 1) {
- if (digits == MAX_LENGTH_OF_LONG - 1) {
- int cmp = strncmp((char*)YYCURSOR - MAX_LENGTH_OF_LONG, long_min_digits, MAX_LENGTH_OF_LONG - 1);
-
- if (!(cmp < 0 || (cmp == 0 && start[2] == '-'))) {
- goto use_double;
- }
- } else {
- goto use_double;
- }
- }
-#endif
- *p = YYCURSOR;
- ZVAL_LONG(rval, parse_iv(start + 2));
- return 1;
-}
-#line 1094 "ext/standard/var_unserializer.c"
-yy78:
- yych = *++YYCURSOR;
- if (yych == '"') goto yy92;
- goto yy18;
-yy79:
- ++YYCURSOR;
-#line 623 "ext/standard/var_unserializer.re"
- {
- zend_long id;
-
- *p = YYCURSOR;
- if (!var_hash) return 0;
-
- id = parse_iv(start + 2) - 1;
- if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) {
- return 0;
- }
-
- if (rval_ref == rval) {
- return 0;
- }
-
- if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) {
- ZVAL_UNDEF(rval);
- return 1;
- }
-
- ZVAL_COPY(rval, rval_ref);
-
- return 1;
-}
-#line 1126 "ext/standard/var_unserializer.c"
-yy81:
- yych = *++YYCURSOR;
- if (yych == '"') goto yy94;
- goto yy18;
-yy82:
- ++YYCURSOR;
-#line 808 "ext/standard/var_unserializer.re"
+#line 809 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
zend_long elements;
@@ -1274,10 +876,105 @@ yy82:
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
-#line 1278 "ext/standard/var_unserializer.c"
-yy84:
+#line 880 "ext/standard/var_unserializer.c"
+yy25:
+ yych = *++YYCURSOR;
+ if (yych <= ',') {
+ if (yych != '+') goto yy18;
+ } else {
+ if (yych <= '-') goto yy26;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy27;
+ goto yy18;
+ }
+yy26:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy27:
++YYCURSOR;
-#line 743 "ext/standard/var_unserializer.re"
+ if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy27;
+ if (yych >= ';') goto yy18;
+ yych = *++YYCURSOR;
+ if (yych != '"') goto yy18;
+ ++YYCURSOR;
+#line 802 "ext/standard/var_unserializer.re"
+ {
+ if (!var_hash) return 0;
+
+ return object_common2(UNSERIALIZE_PASSTHRU,
+ object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
+}
+#line 912 "ext/standard/var_unserializer.c"
+yy32:
+ yych = *++YYCURSOR;
+ if (yych == '+') goto yy33;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy34;
+ goto yy18;
+yy33:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy34:
+ ++YYCURSOR;
+ if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy34;
+ if (yych >= ';') goto yy18;
+ yych = *++YYCURSOR;
+ if (yych != '{') goto yy18;
+ ++YYCURSOR;
+#line 778 "ext/standard/var_unserializer.re"
+ {
+ zend_long elements = parse_iv(start + 2);
+ /* use iv() not uiv() in order to check data range */
+ *p = YYCURSOR;
+ if (!var_hash) return 0;
+
+ if (elements < 0) {
+ return 0;
+ }
+
+ array_init_size(rval, elements);
+ if (elements) {
+ /* we can't convert from packed to hash during unserialization, because
+ reference to some zvals might be keept in var_hash (to support references) */
+ zend_hash_real_init(Z_ARRVAL_P(rval), 0);
+ }
+
+ if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, 0)) {
+ return 0;
+ }
+
+ return finish_nested_data(UNSERIALIZE_PASSTHRU);
+}
+#line 957 "ext/standard/var_unserializer.c"
+yy39:
+ yych = *++YYCURSOR;
+ if (yych == '+') goto yy40;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy41;
+ goto yy18;
+yy40:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy41:
+ ++YYCURSOR;
+ if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy41;
+ if (yych >= ';') goto yy18;
+ yych = *++YYCURSOR;
+ if (yych != '"') goto yy18;
+ ++YYCURSOR;
+#line 744 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
zend_string *str;
@@ -1311,127 +1008,407 @@ yy84:
ZVAL_STR(rval, str);
return 1;
}
-#line 1315 "ext/standard/var_unserializer.c"
-yy86:
+#line 1012 "ext/standard/var_unserializer.c"
+yy46:
+ yych = *++YYCURSOR;
+ if (yych == '+') goto yy47;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy48;
+ goto yy18;
+yy47:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy48:
++YYCURSOR;
-#line 777 "ext/standard/var_unserializer.re"
+ if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy48;
+ if (yych >= ';') goto yy18;
+ yych = *++YYCURSOR;
+ if (yych != '"') goto yy18;
+ ++YYCURSOR;
+#line 712 "ext/standard/var_unserializer.re"
{
- zend_long elements = parse_iv(start + 2);
- /* use iv() not uiv() in order to check data range */
- *p = YYCURSOR;
- if (!var_hash) return 0;
+ size_t len, maxlen;
+ char *str;
- if (elements < 0) {
+ len = parse_uiv(start + 2);
+ maxlen = max - YYCURSOR;
+ if (maxlen < len) {
+ *p = start + 2;
return 0;
}
- array_init_size(rval, elements);
- if (elements) {
- /* we can't convert from packed to hash during unserialization, because
- reference to some zvals might be keept in var_hash (to support references) */
- zend_hash_real_init(Z_ARRVAL_P(rval), 0);
+ str = (char*)YYCURSOR;
+
+ YYCURSOR += len;
+
+ if (*(YYCURSOR) != '"') {
+ *p = YYCURSOR;
+ return 0;
}
- if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, 0)) {
+ if (*(YYCURSOR + 1) != ';') {
+ *p = YYCURSOR + 1;
return 0;
}
- return finish_nested_data(UNSERIALIZE_PASSTHRU);
+ YYCURSOR += 2;
+ *p = YYCURSOR;
+
+ ZVAL_STRINGL(rval, str, len);
+ return 1;
}
-#line 1342 "ext/standard/var_unserializer.c"
-yy88:
+#line 1065 "ext/standard/var_unserializer.c"
+yy53:
+ yych = *++YYCURSOR;
+ if (yych <= '/') {
+ if (yych <= ',') {
+ if (yych == '+') goto yy57;
+ goto yy18;
+ } else {
+ if (yych <= '-') goto yy55;
+ if (yych <= '.') goto yy60;
+ goto yy18;
+ }
+ } else {
+ if (yych <= 'I') {
+ if (yych <= '9') goto yy58;
+ if (yych <= 'H') goto yy18;
+ goto yy56;
+ } else {
+ if (yych != 'N') goto yy18;
+ }
+ }
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy76;
+ goto yy18;
+yy55:
+ yych = *++YYCURSOR;
+ if (yych <= '/') {
+ if (yych == '.') goto yy60;
+ goto yy18;
+ } else {
+ if (yych <= '9') goto yy58;
+ if (yych != 'I') goto yy18;
+ }
+yy56:
+ yych = *++YYCURSOR;
+ if (yych == 'N') goto yy72;
+ goto yy18;
+yy57:
+ yych = *++YYCURSOR;
+ if (yych == '.') goto yy60;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy58:
+ ++YYCURSOR;
+ if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ yych = *YYCURSOR;
+ if (yych <= ':') {
+ if (yych <= '.') {
+ if (yych <= '-') goto yy18;
+ goto yy70;
+ } else {
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy58;
+ goto yy18;
+ }
+ } else {
+ if (yych <= 'E') {
+ if (yych <= ';') goto yy63;
+ if (yych <= 'D') goto yy18;
+ goto yy65;
+ } else {
+ if (yych == 'e') goto yy65;
+ goto yy18;
+ }
+ }
+yy60:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy61:
+ ++YYCURSOR;
+ if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ yych = *YYCURSOR;
+ if (yych <= ';') {
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy61;
+ if (yych <= ':') goto yy18;
+ } else {
+ if (yych <= 'E') {
+ if (yych <= 'D') goto yy18;
+ goto yy65;
+ } else {
+ if (yych == 'e') goto yy65;
+ goto yy18;
+ }
+ }
+yy63:
+ ++YYCURSOR;
+#line 703 "ext/standard/var_unserializer.re"
+ {
+#if SIZEOF_ZEND_LONG == 4
+use_double:
+#endif
+ *p = YYCURSOR;
+ ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL));
+ return 1;
+}
+#line 1162 "ext/standard/var_unserializer.c"
+yy65:
+ yych = *++YYCURSOR;
+ if (yych <= ',') {
+ if (yych != '+') goto yy18;
+ } else {
+ if (yych <= '-') goto yy66;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy67;
+ goto yy18;
+ }
+yy66:
yych = *++YYCURSOR;
if (yych <= ',') {
- if (yych == '+') goto yy96;
+ if (yych == '+') goto yy69;
goto yy18;
} else {
- if (yych <= '-') goto yy96;
+ if (yych <= '-') goto yy69;
if (yych <= '/') goto yy18;
if (yych >= ':') goto yy18;
}
-yy89:
+yy67:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy89;
- if (yych == ';') goto yy71;
+ if (yych <= '9') goto yy67;
+ if (yych == ';') goto yy63;
goto yy18;
-yy91:
+yy69:
yych = *++YYCURSOR;
- if (yych == ';') goto yy97;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy67;
goto yy18;
-yy92:
+yy70:
++YYCURSOR;
-#line 801 "ext/standard/var_unserializer.re"
+ if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ yych = *YYCURSOR;
+ if (yych <= ';') {
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy70;
+ if (yych <= ':') goto yy18;
+ goto yy63;
+ } else {
+ if (yych <= 'E') {
+ if (yych <= 'D') goto yy18;
+ goto yy65;
+ } else {
+ if (yych == 'e') goto yy65;
+ goto yy18;
+ }
+ }
+yy72:
+ yych = *++YYCURSOR;
+ if (yych != 'F') goto yy18;
+yy73:
+ yych = *++YYCURSOR;
+ if (yych != ';') goto yy18;
+ ++YYCURSOR;
+#line 687 "ext/standard/var_unserializer.re"
{
- if (!var_hash) return 0;
+ *p = YYCURSOR;
- return object_common2(UNSERIALIZE_PASSTHRU,
- object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
+ if (!strncmp((char*)start + 2, "NAN", 3)) {
+ ZVAL_DOUBLE(rval, ZEND_NAN);
+ } else if (!strncmp((char*)start + 2, "INF", 3)) {
+ ZVAL_DOUBLE(rval, ZEND_INFINITY);
+ } else if (!strncmp((char*)start + 2, "-INF", 4)) {
+ ZVAL_DOUBLE(rval, -ZEND_INFINITY);
+ } else {
+ ZVAL_NULL(rval);
+ }
+
+ return 1;
}
-#line 1374 "ext/standard/var_unserializer.c"
-yy94:
+#line 1237 "ext/standard/var_unserializer.c"
+yy76:
+ yych = *++YYCURSOR;
+ if (yych == 'N') goto yy73;
+ goto yy18;
+yy77:
+ yych = *++YYCURSOR;
+ if (yych <= ',') {
+ if (yych != '+') goto yy18;
+ } else {
+ if (yych <= '-') goto yy78;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy79;
+ goto yy18;
+ }
+yy78:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy79:
++YYCURSOR;
-#line 711 "ext/standard/var_unserializer.re"
+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy79;
+ if (yych != ';') goto yy18;
+ ++YYCURSOR;
+#line 661 "ext/standard/var_unserializer.re"
{
- size_t len, maxlen;
- char *str;
+#if SIZEOF_ZEND_LONG == 4
+ int digits = YYCURSOR - start - 3;
- len = parse_uiv(start + 2);
- maxlen = max - YYCURSOR;
- if (maxlen < len) {
- *p = start + 2;
- return 0;
+ if (start[2] == '-' || start[2] == '+') {
+ digits--;
}
- str = (char*)YYCURSOR;
+ /* Use double for large zend_long values that were serialized on a 64-bit system */
+ if (digits >= MAX_LENGTH_OF_LONG - 1) {
+ if (digits == MAX_LENGTH_OF_LONG - 1) {
+ int cmp = strncmp((char*)YYCURSOR - MAX_LENGTH_OF_LONG, long_min_digits, MAX_LENGTH_OF_LONG - 1);
- YYCURSOR += len;
+ if (!(cmp < 0 || (cmp == 0 && start[2] == '-'))) {
+ goto use_double;
+ }
+ } else {
+ goto use_double;
+ }
+ }
+#endif
+ *p = YYCURSOR;
+ ZVAL_LONG(rval, parse_iv(start + 2));
+ return 1;
+}
+#line 1290 "ext/standard/var_unserializer.c"
+yy83:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= '2') goto yy18;
+ yych = *++YYCURSOR;
+ if (yych != ';') goto yy18;
+ ++YYCURSOR;
+#line 655 "ext/standard/var_unserializer.re"
+ {
+ *p = YYCURSOR;
+ ZVAL_BOOL(rval, parse_iv(start + 2));
+ return 1;
+}
+#line 1304 "ext/standard/var_unserializer.c"
+yy87:
+ ++YYCURSOR;
+#line 649 "ext/standard/var_unserializer.re"
+ {
+ *p = YYCURSOR;
+ ZVAL_NULL(rval);
+ return 1;
+}
+#line 1313 "ext/standard/var_unserializer.c"
+yy89:
+ yych = *++YYCURSOR;
+ if (yych <= ',') {
+ if (yych != '+') goto yy18;
+ } else {
+ if (yych <= '-') goto yy90;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy91;
+ goto yy18;
+ }
+yy90:
+ yych = *++YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy91:
+ ++YYCURSOR;
+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy91;
+ if (yych != ';') goto yy18;
+ ++YYCURSOR;
+#line 624 "ext/standard/var_unserializer.re"
+ {
+ zend_long id;
- if (*(YYCURSOR) != '"') {
- *p = YYCURSOR;
+ *p = YYCURSOR;
+ if (!var_hash) return 0;
+
+ id = parse_iv(start + 2) - 1;
+ if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) {
return 0;
}
- if (*(YYCURSOR + 1) != ';') {
- *p = YYCURSOR + 1;
+ if (rval_ref == rval) {
return 0;
}
- YYCURSOR += 2;
- *p = YYCURSOR;
+ if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) {
+ ZVAL_UNDEF(rval);
+ return 1;
+ }
+
+ ZVAL_COPY(rval, rval_ref);
- ZVAL_STRINGL(rval, str, len);
return 1;
}
-#line 1409 "ext/standard/var_unserializer.c"
+#line 1361 "ext/standard/var_unserializer.c"
+yy95:
+ yych = *++YYCURSOR;
+ if (yych <= ',') {
+ if (yych != '+') goto yy18;
+ } else {
+ if (yych <= '-') goto yy96;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy97;
+ goto yy18;
+ }
yy96:
yych = *++YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy89;
- goto yy18;
+ if (yych >= ':') goto yy18;
yy97:
++YYCURSOR;
-#line 686 "ext/standard/var_unserializer.re"
+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy97;
+ if (yych != ';') goto yy18;
+ ++YYCURSOR;
+#line 598 "ext/standard/var_unserializer.re"
{
- *p = YYCURSOR;
+ zend_long id;
- if (!strncmp((char*)start + 2, "NAN", 3)) {
- ZVAL_DOUBLE(rval, php_get_nan());
- } else if (!strncmp((char*)start + 2, "INF", 3)) {
- ZVAL_DOUBLE(rval, php_get_inf());
- } else if (!strncmp((char*)start + 2, "-INF", 4)) {
- ZVAL_DOUBLE(rval, -php_get_inf());
+ *p = YYCURSOR;
+ if (!var_hash) return 0;
+
+ id = parse_iv(start + 2) - 1;
+ if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) {
+ return 0;
+ }
+
+ zval_ptr_dtor(rval);
+ if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) {
+ ZVAL_UNDEF(rval);
+ return 1;
+ }
+ if (Z_ISREF_P(rval_ref)) {
+ ZVAL_COPY(rval, rval_ref);
} else {
- ZVAL_NULL(rval);
+ ZVAL_NEW_REF(rval_ref, rval_ref);
+ ZVAL_COPY(rval, rval_ref);
}
return 1;
}
-#line 1433 "ext/standard/var_unserializer.c"
+#line 1410 "ext/standard/var_unserializer.c"
}
-#line 961 "ext/standard/var_unserializer.re"
+#line 962 "ext/standard/var_unserializer.re"
return 0;
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index 6d53cb6249..4b6266cb1c 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -21,6 +21,7 @@
#include "php.h"
#include "ext/standard/php_var.h"
#include "php_incomplete_class.h"
+#include "zend_portability.h"
struct php_unserialize_data {
void *first;
@@ -687,11 +688,11 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER)
*p = YYCURSOR;
if (!strncmp((char*)start + 2, "NAN", 3)) {
- ZVAL_DOUBLE(rval, php_get_nan());
+ ZVAL_DOUBLE(rval, ZEND_NAN);
} else if (!strncmp((char*)start + 2, "INF", 3)) {
- ZVAL_DOUBLE(rval, php_get_inf());
+ ZVAL_DOUBLE(rval, ZEND_INFINITY);
} else if (!strncmp((char*)start + 2, "-INF", 4)) {
- ZVAL_DOUBLE(rval, -php_get_inf());
+ ZVAL_DOUBLE(rval, -ZEND_INFINITY);
} else {
ZVAL_NULL(rval);
}