|
42 | 42 | #include <zend_exceptions.h> |
43 | 43 | #include <ext/standard/php_smart_str.h> |
44 | 44 | #include <ext/standard/php_var.h> |
| 45 | +#include <ext/standard/basic_functions.h> |
45 | 46 | #include <libmemcached/memcached.h> |
46 | 47 |
|
47 | 48 | #include "php_memcached.h" |
| 49 | +#include "g_fmt.h" |
48 | 50 |
|
49 | 51 | #ifdef HAVE_MEMCACHED_SESSION |
50 | 52 | # include "php_memcached_session.h" |
@@ -2480,27 +2482,28 @@ static char *php_memc_zval_to_payload(zval *value, size_t *payload_len, uint32_t |
2480 | 2482 | break; |
2481 | 2483 |
|
2482 | 2484 | case IS_LONG: |
| 2485 | + smart_str_append_long(&buf, Z_LVAL_P(value)); |
| 2486 | + MEMC_VAL_SET_TYPE(*flags, MEMC_VAL_IS_LONG); |
| 2487 | + break; |
| 2488 | + |
2483 | 2489 | case IS_DOUBLE: |
2484 | | - case IS_BOOL: |
2485 | 2490 | { |
2486 | | - zval value_copy; |
| 2491 | + char dstr[40] = {0}; |
2487 | 2492 |
|
2488 | | - value_copy = *value; |
2489 | | - zval_copy_ctor(&value_copy); |
2490 | | - convert_to_string(&value_copy); |
2491 | | - smart_str_appendl(&buf, Z_STRVAL(value_copy), Z_STRLEN(value_copy)); |
2492 | | - zval_dtor(&value_copy); |
| 2493 | + php_memcached_g_fmt(dstr, Z_DVAL_P(value)); |
| 2494 | + smart_str_appends(&buf, dstr); |
| 2495 | + MEMC_VAL_SET_TYPE(*flags, MEMC_VAL_IS_DOUBLE); |
| 2496 | + break; |
| 2497 | + } |
2493 | 2498 |
|
2494 | | - *flags &= ~MEMC_VAL_COMPRESSED; |
2495 | | - if (Z_TYPE_P(value) == IS_LONG) { |
2496 | | - MEMC_VAL_SET_TYPE(*flags, MEMC_VAL_IS_LONG); |
2497 | | - } else if (Z_TYPE_P(value) == IS_DOUBLE) { |
2498 | | - MEMC_VAL_SET_TYPE(*flags, MEMC_VAL_IS_DOUBLE); |
2499 | | - } else if (Z_TYPE_P(value) == IS_BOOL) { |
2500 | | - MEMC_VAL_SET_TYPE(*flags, MEMC_VAL_IS_BOOL); |
| 2499 | + case IS_BOOL: |
| 2500 | + if (Z_BVAL_P(value)) { |
| 2501 | + smart_str_appendc(&buf, '1'); |
| 2502 | + } else { |
| 2503 | + smart_str_appendl(&buf, "", 0); |
2501 | 2504 | } |
| 2505 | + MEMC_VAL_SET_TYPE(*flags, MEMC_VAL_IS_BOOL); |
2502 | 2506 | break; |
2503 | | - } |
2504 | 2507 |
|
2505 | 2508 | default: |
2506 | 2509 | switch (serializer) { |
@@ -2690,11 +2693,16 @@ static int php_memc_zval_from_payload(zval *value, char *payload, size_t payload |
2690 | 2693 | } |
2691 | 2694 |
|
2692 | 2695 | case MEMC_VAL_IS_DOUBLE: |
2693 | | - { |
2694 | | - double dval = zend_strtod(payload, NULL); |
2695 | | - ZVAL_DOUBLE(value, dval); |
| 2696 | + if (payload_len == 8 && memcmp(payload, "Infinity", 8) == 0) { |
| 2697 | + ZVAL_DOUBLE(value, php_get_inf()); |
| 2698 | + } else if (payload_len == 9 && memcmp(payload, "-Infinity", 9) == 0) { |
| 2699 | + ZVAL_DOUBLE(value, -php_get_inf()); |
| 2700 | + } else if (payload_len == 3 && memcmp(payload, "NaN", 3) == 0) { |
| 2701 | + ZVAL_DOUBLE(value, php_get_nan()); |
| 2702 | + } else { |
| 2703 | + ZVAL_DOUBLE(value, zend_strtod(payload, NULL)); |
| 2704 | + } |
2696 | 2705 | break; |
2697 | | - } |
2698 | 2706 |
|
2699 | 2707 | case MEMC_VAL_IS_BOOL: |
2700 | 2708 | ZVAL_BOOL(value, payload_len > 0 && payload[0] == '1'); |
|
0 commit comments