From 0acf6ec15091b4236bc8e8f0571cb276f116a3ef Mon Sep 17 00:00:00 2001 From: advect Date: Mon, 27 Dec 2010 11:09:14 +0900 Subject: [PATCH] php: version 0.3.3 --- php/ChangeLog | 9 + php/benchmark.php | 67 ++-- php/config.m4 | 13 +- php/msgpack.c | 80 +++-- php/msgpack/pack_template.h | 44 +-- php/msgpack/sysdep.h | 10 +- php/msgpack_class.c | 71 +++- php/msgpack_class.h | 2 + php/msgpack_pack.c | 33 +- php/msgpack_unpack.c | 288 +++++++++------- php/msgpack_unpack.h | 3 +- php/package.xml | 133 ++++--- php/php-msgpack.spec | 2 +- php/php_msgpack.h | 2 +- php/tests/009.phpt | 6 +- php/tests/009b.phpt | 6 +- php/tests/012.phpt | 4 + php/tests/012c.phpt | 52 +++ php/tests/015.phpt | 4 + php/tests/015b.phpt | 4 + php/tests/015d.phpt | 62 ++++ php/tests/015e.phpt | 65 ++++ php/tests/015f.phpt | 65 ++++ php/tests/016.phpt | 4 + php/tests/016c.phpt | 64 ++++ php/tests/021.phpt | 4 + php/tests/023.phpt | 21 +- php/tests/024.phpt | 6 +- php/tests/024b.phpt | 9 +- php/tests/024c.phpt | 170 +++++++++ php/tests/025.phpt | 4 + php/tests/025c.phpt | 123 +++++++ php/tests/026.phpt | 8 +- php/tests/026b.phpt | 11 +- php/tests/026d.phpt | 147 ++++++++ php/tests/027.phpt | 4 + php/tests/027d.phpt | 77 +++++ php/tests/028.phpt | 8 +- php/tests/028b.phpt | 11 +- php/tests/028c.phpt | 672 ++++++++++++++++++++++++++++++++++++ php/tests/028d.phpt | 671 +++++++++++++++++++++++++++++++++++ php/tests/031.phpt | 4 + php/tests/040.phpt | 2 +- php/tests/040b.phpt | 44 +++ php/tests/040c.phpt | 53 +++ php/tests/040d.phpt | 52 +++ php/tests/060.phpt | 6 +- php/tests/060b.phpt | 9 +- php/tests/060c.phpt | 319 +++++++++++++++++ php/tests/061.phpt | 6 +- php/tests/061b.phpt | 9 +- php/tests/061c.phpt | 324 +++++++++++++++++ php/tests/064.phpt | 6 +- php/tests/064b.phpt | 9 +- php/tests/064c.phpt | 321 +++++++++++++++++ php/tests/065.phpt | 6 +- php/tests/065b.phpt | 9 +- php/tests/065c.phpt | 326 +++++++++++++++++ php/tests/070.phpt | 6 +- php/tests/070b.phpt | 9 +- php/tests/070c.phpt | 303 ++++++++++++++++ php/tests/071.phpt | 6 +- php/tests/071b.phpt | 9 +- php/tests/071c.phpt | 305 ++++++++++++++++ php/tests/072.phpt | 6 +- php/tests/072b.phpt | 9 +- php/tests/072c.phpt | 345 ++++++++++++++++++ php/tests/073.phpt | 6 +- php/tests/073b.phpt | 9 +- php/tests/073c.phpt | 346 +++++++++++++++++++ php/tests/087.phpt | 4 + php/tests/087d.phpt | 306 ++++++++++++++++ php/tests/088.phpt | 4 + php/tests/088d.phpt | 349 +++++++++++++++++++ php/tests/089.phpt | 4 + php/tests/089d.phpt | 351 +++++++++++++++++++ 76 files changed, 6549 insertions(+), 372 deletions(-) create mode 100644 php/tests/012c.phpt create mode 100644 php/tests/015d.phpt create mode 100644 php/tests/015e.phpt create mode 100644 php/tests/015f.phpt create mode 100644 php/tests/016c.phpt create mode 100644 php/tests/024c.phpt create mode 100644 php/tests/025c.phpt create mode 100644 php/tests/026d.phpt create mode 100644 php/tests/027d.phpt create mode 100644 php/tests/028c.phpt create mode 100644 php/tests/028d.phpt create mode 100644 php/tests/040b.phpt create mode 100644 php/tests/040c.phpt create mode 100644 php/tests/040d.phpt create mode 100644 php/tests/060c.phpt create mode 100644 php/tests/061c.phpt create mode 100644 php/tests/064c.phpt create mode 100644 php/tests/065c.phpt create mode 100644 php/tests/070c.phpt create mode 100644 php/tests/071c.phpt create mode 100644 php/tests/072c.phpt create mode 100644 php/tests/073c.phpt create mode 100644 php/tests/087d.phpt create mode 100644 php/tests/088d.phpt create mode 100644 php/tests/089d.phpt diff --git a/php/ChangeLog b/php/ChangeLog index 3eb64e72..d36193b4 100644 --- a/php/ChangeLog +++ b/php/ChangeLog @@ -1,5 +1,14 @@ msgpack extension changelog +Version 0.3.3 +------------- + * Update msgpack header files. + * Fix unpack internal processing. + +Version 0.3.2 +------------- + * Version PHP 5 or newer. + Version 0.3.1 ------------- * Fix class MessagePackUnpacker. diff --git a/php/benchmark.php b/php/benchmark.php index 559801cb..cd531a9e 100644 --- a/php/benchmark.php +++ b/php/benchmark.php @@ -1,6 +1,4 @@ start(); + + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $pack = serialize($value); } - $t->setMarker('serialize'); + $end = microtime(true); + $serialize_pack += ($end - $start); + + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $unpack = unserialize($pack); } - $t->stop(); - //$t->display(); - $profiling = $t->getProfiling(); - unset($t); + $end = microtime(true); + $serialize_unpack += ($end - $start); - $serialize_pack += $profiling[1]['diff']; - $serialize_unpack += $profiling[2]['diff']; $serialize_size += strlen($pack); if ($unpack === $value || (is_object($value) && $unpack == $value)) @@ -120,24 +117,22 @@ foreach ($types as $type) { $opt = true; } - $t = new Benchmark_Timer; - $t->start(); + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $pack = json_encode($value); } - $t->setMarker('json_encode'); + $end = microtime(true); + $json_pack += ($end - $start); + + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $unpack = json_decode($pack, $opt); } - $t->stop(); - //$t->display(); - $profiling = $t->getProfiling(); - unset($t); + $end = microtime(true); + $json_unpack += ($end - $start); - $json_pack += $profiling[1]['diff']; - $json_unpack += $profiling[2]['diff']; $json_size += strlen($pack); if ($unpack === $value || (is_object($value) && $unpack == $value) || @@ -153,24 +148,22 @@ foreach ($types as $type) { $pack = null; $unpack = null; - $t = new Benchmark_Timer; - $t->start(); + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $pack = igbinary_serialize($value); } - $t->setMarker('igbinary_serialize'); + $end = microtime(true); + $igbinary_pack += ($end - $start); + + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $unpack = igbinary_unserialize($pack); } - $t->stop(); - //$t->display(); - $profiling = $t->getProfiling(); - unset($t); + $end = microtime(true); + $igbinary_unpack += ($end - $start); - $igbinary_pack += $profiling[1]['diff']; - $igbinary_unpack += $profiling[2]['diff']; $igbinary_size += strlen($pack); if ($unpack === $value || (is_object($value) && $unpack == $value)) @@ -182,24 +175,22 @@ foreach ($types as $type) //msgpack $pack = null; $unpack = null; - $t = new Benchmark_Timer; - $t->start(); + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $pack = msgpack_serialize($value); } - $t->setMarker('msgpack_serialize'); + $end = microtime(true); + $msgpack_pack += ($end - $start); + + $start = microtime(true); for ($i = 0; $i < $loop; $i++) { $unpack = msgpack_unserialize($pack); } - $t->stop(); - //$t->display(); - $profiling = $t->getProfiling(); - unset($t); + $end = microtime(true); + $msgpack_unpack += ($end - $start); - $msgpack_pack += $profiling[1]['diff']; - $msgpack_unpack += $profiling[2]['diff']; $msgpack_size += strlen($pack); if ($unpack === $value || (is_object($value) && $unpack == $value)) diff --git a/php/config.m4 b/php/config.m4 index a78e1f32..19df8afe 100644 --- a/php/config.m4 +++ b/php/config.m4 @@ -8,12 +8,12 @@ dnl Check PHP version: AC_MSG_CHECKING(PHP version) AC_TRY_COMPILE([#include "php/main/php_version.h"], [ -#if PHP_MAJOR_VERSION < 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 2) -#error this extension requires at least PHP version 5.2.0 +#if PHP_MAJOR_VERSION < 5 +#error this extension requires at least PHP version 5 or newer #endif ], [AC_MSG_RESULT(ok)], -[AC_MSG_ERROR([need at least PHP 5.2.0])]) +[AC_MSG_ERROR([need at least PHP 5 or newer])]) dnl If your extension references something external, use with: @@ -24,5 +24,10 @@ Make sure that the comment is aligned: if test "$PHP_MSGPACK" != "no"; then PHP_NEW_EXTENSION(msgpack, msgpack.c msgpack_pack.c msgpack_unpack.c msgpack_class.c, $ext_shared) - PHP_INSTALL_HEADERS([ext/msgpack], [php_msgpack.h]) + ifdef([PHP_INSTALL_HEADERS], + [ + PHP_INSTALL_HEADERS([ext/msgpack], [php_msgpack.h]) + ], [ + PHP_ADD_MAKEFILE_FRAGMENT + ]) fi diff --git a/php/msgpack.c b/php/msgpack.c index 3b375ba4..0d48be11 100644 --- a/php/msgpack.c +++ b/php/msgpack.c @@ -77,6 +77,12 @@ static ZEND_MINIT_FUNCTION(msgpack) msgpack_init_class(); +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 1) + REGISTER_LONG_CONSTANT( + "MESSAGEPACK_OPT_PHPONLY", MSGPACK_CLASS_OPT_PHPONLY, + CONST_CS | CONST_PERSISTENT); +#endif + return SUCCESS; } @@ -164,33 +170,41 @@ PS_SERIALIZER_DECODE_FUNC(msgpack) msgpack_unserialize_var_init(&var_hash); - (&mp)->user.retval = (zval *)tmp; - (&mp)->user.var_hash = (php_unserialize_data_t *)&var_hash; + mp.user.retval = (zval *)tmp; + mp.user.var_hash = (php_unserialize_data_t *)&var_hash; ret = template_execute(&mp, (char *)val, (size_t)vallen, &off); - msgpack_unserialize_var_destroy(&var_hash); - - tmp_hash = HASH_OF(tmp); - - zend_hash_internal_pointer_reset_ex(tmp_hash, &tmp_hash_pos); - while (zend_hash_get_current_data_ex( - tmp_hash, (void *)&value, &tmp_hash_pos) == SUCCESS) + if (ret == MSGPACK_UNPACK_EXTRA_BYTES || ret == MSGPACK_UNPACK_SUCCESS) { - ret = zend_hash_get_current_key_ex( - tmp_hash, &key_str, &key_len, &key_long, 0, &tmp_hash_pos); - switch (ret) + msgpack_unserialize_var_destroy(&var_hash, 0); + + tmp_hash = HASH_OF(tmp); + + zend_hash_internal_pointer_reset_ex(tmp_hash, &tmp_hash_pos); + + while (zend_hash_get_current_data_ex( + tmp_hash, (void *)&value, &tmp_hash_pos) == SUCCESS) { - case HASH_KEY_IS_LONG: - /* ??? */ - break; - case HASH_KEY_IS_STRING: - php_set_session_var( - key_str, key_len - 1, *value, NULL TSRMLS_CC); - php_add_session_var(key_str, key_len - 1 TSRMLS_CC); - break; + ret = zend_hash_get_current_key_ex( + tmp_hash, &key_str, &key_len, &key_long, 0, &tmp_hash_pos); + switch (ret) + { + case HASH_KEY_IS_LONG: + /* ??? */ + break; + case HASH_KEY_IS_STRING: + php_set_session_var( + key_str, key_len - 1, *value, NULL TSRMLS_CC); + php_add_session_var(key_str, key_len - 1 TSRMLS_CC); + break; + } + zend_hash_move_forward_ex(tmp_hash, &tmp_hash_pos); } - zend_hash_move_forward_ex(tmp_hash, &tmp_hash_pos); + } + else + { + msgpack_unserialize_var_destroy(&var_hash, 1); } zval_ptr_dtor(&tmp); @@ -226,43 +240,49 @@ PHP_MSGPACK_API void php_msgpack_unserialize( msgpack_unserialize_var_init(&var_hash); - (&mp)->user.retval = (zval *)return_value; - (&mp)->user.var_hash = (php_unserialize_data_t *)&var_hash; + mp.user.retval = (zval *)return_value; + mp.user.var_hash = (php_unserialize_data_t *)&var_hash; ret = template_execute(&mp, str, (size_t)str_len, &off); - msgpack_unserialize_var_destroy(&var_hash); - switch (ret) { case MSGPACK_UNPACK_PARSE_ERROR: + { + msgpack_unserialize_var_destroy(&var_hash, 1); if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (php_msgpack_unserialize) Parse error"); + "[msgpack] (%s) Parse error", __FUNCTION__); } break; + } case MSGPACK_UNPACK_CONTINUE: + { + msgpack_unserialize_var_destroy(&var_hash, 1); if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (php_msgpack_unserialize) " - "Insufficient data for unserializing"); + "[msgpack] (%s) Insufficient data for unserializing", + __FUNCTION__); } break; + } case MSGPACK_UNPACK_EXTRA_BYTES: case MSGPACK_UNPACK_SUCCESS: + msgpack_unserialize_var_destroy(&var_hash, 0); if (off < (size_t)str_len && MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (php_msgpack_unserialize) Extra bytes"); + "[msgpack] (%s) Extra bytes", __FUNCTION__); } break; default: + msgpack_unserialize_var_destroy(&var_hash, 0); if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (php_msgpack_unserialize) Unknown result"); + "[msgpack] (%s) Unknown result", __FUNCTION__); } break; } diff --git a/php/msgpack/pack_template.h b/php/msgpack/pack_template.h index b636967f..da54c364 100644 --- a/php/msgpack/pack_template.h +++ b/php/msgpack/pack_template.h @@ -69,7 +69,7 @@ do { \ } else { \ /* unsigned 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } \ } while(0) @@ -89,12 +89,12 @@ do { \ if(d < (1<<16)) { \ /* unsigned 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } else { \ /* unsigned 32 */ \ unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], d); \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ msgpack_pack_append_buffer(x, buf, 5); \ } \ } \ @@ -103,7 +103,7 @@ do { \ #define msgpack_pack_real_uint64(x, d) \ do { \ if(d < (1ULL<<8)) { \ - if(d < (1<<7)) { \ + if(d < (1ULL<<7)) { \ /* fixnum */ \ msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ } else { \ @@ -115,12 +115,12 @@ do { \ if(d < (1ULL<<16)) { \ /* unsigned 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } else if(d < (1ULL<<32)) { \ /* unsigned 32 */ \ unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], d); \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ msgpack_pack_append_buffer(x, buf, 5); \ } else { \ /* unsigned 64 */ \ @@ -149,7 +149,7 @@ do { \ if(d < -(1<<7)) { \ /* signed 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } else { \ /* signed 8 */ \ @@ -167,7 +167,7 @@ do { \ } else { \ /* unsigned 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } \ } \ @@ -179,12 +179,12 @@ do { \ if(d < -(1<<15)) { \ /* signed 32 */ \ unsigned char buf[5]; \ - buf[0] = 0xd2; _msgpack_store32(&buf[1], d); \ + buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ msgpack_pack_append_buffer(x, buf, 5); \ } else if(d < -(1<<7)) { \ /* signed 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } else { \ /* signed 8 */ \ @@ -202,12 +202,12 @@ do { \ } else if(d < (1<<16)) { \ /* unsigned 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } else { \ /* unsigned 32 */ \ unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], d); \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ msgpack_pack_append_buffer(x, buf, 5); \ } \ } \ @@ -225,14 +225,14 @@ do { \ } else { \ /* signed 32 */ \ unsigned char buf[5]; \ - buf[0] = 0xd2; _msgpack_store32(&buf[1], d); \ + buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ msgpack_pack_append_buffer(x, buf, 5); \ } \ } else { \ if(d < -(1<<7)) { \ /* signed 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } else { \ /* signed 8 */ \ @@ -252,14 +252,14 @@ do { \ } else { \ /* unsigned 16 */ \ unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], d); \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ msgpack_pack_append_buffer(x, buf, 3); \ } \ } else { \ if(d < (1LL<<32)) { \ /* unsigned 32 */ \ unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], d); \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ msgpack_pack_append_buffer(x, buf, 5); \ } else { \ /* unsigned 64 */ \ @@ -690,11 +690,11 @@ msgpack_pack_inline_func(_array)(msgpack_pack_user x, unsigned int n) msgpack_pack_append_buffer(x, &d, 1); } else if(n < 65536) { unsigned char buf[3]; - buf[0] = 0xdc; _msgpack_store16(&buf[1], n); + buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n); msgpack_pack_append_buffer(x, buf, 3); } else { unsigned char buf[5]; - buf[0] = 0xdd; _msgpack_store32(&buf[1], n); + buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n); msgpack_pack_append_buffer(x, buf, 5); } } @@ -711,11 +711,11 @@ msgpack_pack_inline_func(_map)(msgpack_pack_user x, unsigned int n) msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); } else if(n < 65536) { unsigned char buf[3]; - buf[0] = 0xde; _msgpack_store16(&buf[1], n); + buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n); msgpack_pack_append_buffer(x, buf, 3); } else { unsigned char buf[5]; - buf[0] = 0xdf; _msgpack_store32(&buf[1], n); + buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n); msgpack_pack_append_buffer(x, buf, 5); } } @@ -732,11 +732,11 @@ msgpack_pack_inline_func(_raw)(msgpack_pack_user x, size_t l) msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); } else if(l < 65536) { unsigned char buf[3]; - buf[0] = 0xda; _msgpack_store16(&buf[1], l); + buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l); msgpack_pack_append_buffer(x, buf, 3); } else { unsigned char buf[5]; - buf[0] = 0xdb; _msgpack_store32(&buf[1], l); + buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l); msgpack_pack_append_buffer(x, buf, 5); } } diff --git a/php/msgpack/sysdep.h b/php/msgpack/sysdep.h index 2bc01c9f..8b4ead7a 100644 --- a/php/msgpack/sysdep.h +++ b/php/msgpack/sysdep.h @@ -18,8 +18,9 @@ #ifndef MSGPACK_SYSDEP_H__ #define MSGPACK_SYSDEP_H__ - -#ifdef _MSC_VER +#include +#include +#if defined(_MSC_VER) && _MSC_VER < 1600 typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; @@ -28,8 +29,9 @@ typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; +#elif defined(_MSC_VER) // && _MSC_VER >= 1600 +#include #else -#include #include #include #endif @@ -76,7 +78,7 @@ typedef unsigned int _msgpack_atomic_counter_t; #define _msgpack_be16(x) ntohs(x) #define _msgpack_be32(x) ntohl(x) -#if defined(_byteswap_uint64) +#if defined(_byteswap_uint64) || _MSC_VER >= 1400 # define _msgpack_be64(x) (_byteswap_uint64(x)) #elif defined(bswap_64) # define _msgpack_be64(x) bswap_64(x) diff --git a/php/msgpack_class.c b/php/msgpack_class.c index ce008d99..dd40333e 100644 --- a/php/msgpack_class.c +++ b/php/msgpack_class.c @@ -20,6 +20,7 @@ typedef struct { php_unserialize_data_t var_hash; long php_only; zend_bool finished; + int error; } php_msgpack_unpacker_t; #if ZEND_MODULE_API_NO >= 20060613 @@ -40,16 +41,25 @@ typedef struct { # define POP_EO_PARAM() (void)zend_ptr_stack_pop(&EG(argument_stack)) #endif +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) #define MSGPACK_METHOD_HELPER(classname, name, retval, thisptr, num, param) \ PUSH_PARAM(param); PUSH_PARAM((void*)num); \ PUSH_EO_PARAM(); \ MSGPACK_METHOD_BASE(classname, name)(num, retval, NULL, thisptr, 0 TSRMLS_CC); \ POP_EO_PARAM(); \ - POP_PARAM(); \ - POP_PARAM(); - + POP_PARAM(); POP_PARAM(); #define MSGPACK_METHOD(classname, name, retval, thisptr) \ MSGPACK_METHOD_BASE(classname, name)(0, retval, NULL, thisptr, 0 TSRMLS_CC) +#else +#define MSGPACK_METHOD_HELPER(classname, name, retval, thisptr, num, param) \ + PUSH_PARAM(param); PUSH_PARAM((void*)num); \ + PUSH_EO_PARAM(); \ + MSGPACK_METHOD_BASE(classname, name)(num, retval, thisptr, 0 TSRMLS_CC); \ + POP_EO_PARAM(); \ + POP_PARAM(); POP_PARAM(); +#define MSGPACK_METHOD(classname, name, retval, thisptr) \ + MSGPACK_METHOD_BASE(classname, name)(0, retval, thisptr, 0 TSRMLS_CC) +#endif #define MSGPACK_METHOD1(classname, name, retval, thisptr, param1) \ MSGPACK_METHOD_HELPER(classname, name, retval, thisptr, 1, param1); @@ -62,8 +72,6 @@ typedef struct { php_msgpack_unpacker_t *unpacker; \ unpacker = (php_msgpack_unpacker_t *)zend_object_store_get_object(getThis() TSRMLS_CC); -#define MSGPACK_CLASS_OPT_PHPONLY -1001 - /* MessagePack */ static zend_class_entry *msgpack_ce = NULL; @@ -161,7 +169,15 @@ static const zend_function_entry msgpack_unpacker_methods[] = { static void php_msgpack_base_free(php_msgpack_base_t *base TSRMLS_DC) { +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) zend_object_std_dtor(&base->object TSRMLS_CC); +#else + if (base->object.properties) + { + zend_hash_destroy(base->object.properties); + FREE_HASHTABLE(base->object.properties); + } +#endif efree(base); } @@ -173,7 +189,13 @@ static zend_object_value php_msgpack_base_new(zend_class_entry *ce TSRMLS_DC) base = emalloc(sizeof(php_msgpack_base_t)); +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) zend_object_std_init(&base->object, ce TSRMLS_CC); +#else + ALLOC_HASHTABLE(base->object.properties); + zend_hash_init(base->object.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + base->object.ce = ce; +#endif zend_hash_copy( base->object.properties, &ce->default_properties, @@ -191,7 +213,15 @@ static zend_object_value php_msgpack_base_new(zend_class_entry *ce TSRMLS_DC) static void php_msgpack_unpacker_free( php_msgpack_unpacker_t *unpacker TSRMLS_DC) { +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) zend_object_std_dtor(&unpacker->object TSRMLS_CC); +#else + if (unpacker->object.properties) + { + zend_hash_destroy(unpacker->object.properties); + FREE_HASHTABLE(unpacker->object.properties); + } +#endif efree(unpacker); } @@ -204,7 +234,13 @@ static zend_object_value php_msgpack_unpacker_new( unpacker = emalloc(sizeof(php_msgpack_unpacker_t)); +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) zend_object_std_init(&unpacker->object, ce TSRMLS_CC); +#else + ALLOC_HASHTABLE(unpacker->object.properties); + zend_hash_init(unpacker->object.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + unpacker->object.ce = ce; +#endif zend_hash_copy( unpacker->object.properties, &ce->default_properties, @@ -350,6 +386,7 @@ static ZEND_METHOD(msgpack_unpacker, __construct) unpacker->retval = NULL; unpacker->offset = 0; unpacker->finished = 0; + unpacker->error = 0; template_init(&unpacker->mp); @@ -370,7 +407,7 @@ static ZEND_METHOD(msgpack_unpacker, __destruct) zval_ptr_dtor(&unpacker->retval); } - msgpack_unserialize_var_destroy(&unpacker->var_hash); + msgpack_unserialize_var_destroy(&unpacker->var_hash, unpacker->error); } static ZEND_METHOD(msgpack_unpacker, setOption) @@ -447,6 +484,17 @@ static ZEND_METHOD(msgpack_unpacker, execute) if (str != NULL) { + if (ZEND_NUM_ARGS() < 2) + { + if (MSGPACK_G(error_display)) + { + zend_error(E_WARNING, + "[msgpack] (MessagePackUnpacker::execute) " + "expects exactly 2 parameters"); + } + RETURN_FALSE; + } + data = (char *)str; len = (size_t)str_len; off = Z_LVAL_P(offset); @@ -466,8 +514,8 @@ static ZEND_METHOD(msgpack_unpacker, execute) { zval_ptr_dtor(&unpacker->retval); - msgpack_unserialize_var_destroy(&unpacker->var_hash); - + msgpack_unserialize_var_destroy(&unpacker->var_hash, unpacker->error); + unpacker->error = 0; ALLOC_INIT_ZVAL(unpacker->retval); @@ -502,8 +550,10 @@ static ZEND_METHOD(msgpack_unpacker, execute) case MSGPACK_UNPACK_EXTRA_BYTES: case MSGPACK_UNPACK_SUCCESS: unpacker->finished = 1; + unpacker->error = 0; RETURN_TRUE; default: + unpacker->error = 1; RETURN_FALSE; } } @@ -556,7 +606,8 @@ static ZEND_METHOD(msgpack_unpacker, reset) unpacker->retval = NULL; } - msgpack_unserialize_var_destroy(&unpacker->var_hash); + msgpack_unserialize_var_destroy(&unpacker->var_hash, unpacker->error); + unpacker->error = 0; template_init(&unpacker->mp); @@ -577,9 +628,11 @@ void msgpack_init_class() msgpack_ce = zend_register_internal_class(&ce TSRMLS_CC); msgpack_ce->create_object = php_msgpack_base_new; +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) zend_declare_class_constant_long( msgpack_ce, ZEND_STRS("OPT_PHPONLY") - 1, MSGPACK_CLASS_OPT_PHPONLY TSRMLS_CC); +#endif /* unpacker */ INIT_CLASS_ENTRY(ce, "MessagePackUnpacker", msgpack_unpacker_methods); diff --git a/php/msgpack_class.h b/php/msgpack_class.h index fbebaf4d..f1975238 100644 --- a/php/msgpack_class.h +++ b/php/msgpack_class.h @@ -2,6 +2,8 @@ #ifndef MSGPACK_CLASS_H #define MSGPACK_CLASS_H +#define MSGPACK_CLASS_OPT_PHPONLY -1001 + void msgpack_init_class(); #endif diff --git a/php/msgpack_pack.c b/php/msgpack_pack.c index d2d4ba3b..97ce19ce 100644 --- a/php/msgpack_pack.c +++ b/php/msgpack_pack.c @@ -38,11 +38,15 @@ inline static int msgpack_var_add( + (long)Z_OBJ_HANDLE_P(var)); len = id + sizeof(id) - 1 - p; } - else + else if (Z_TYPE_P(var) == IS_ARRAY) { p = smart_str_print_long(id + sizeof(id) - 1, (long)var); len = id + sizeof(id) - 1 - p; } + else + { + return FAILURE; + } if (var_old && zend_hash_find(var_hash, p, len, var_old) == SUCCESS) { @@ -122,10 +126,11 @@ inline static void msgpack_serialize_class( if (MSGPACK_G(error_display)) { zend_error(E_NOTICE, - "[msgpack] (msgpack_serialize_class) " + "[msgpack] (%s) " "__sleep should return an array only " "containing the names of " - "instance-variables to serialize."); + "instance-variables to serialize.", + __FUNCTION__); } continue; } @@ -199,10 +204,10 @@ inline static void msgpack_serialize_class( if (MSGPACK_G(error_display)) { zend_error(E_NOTICE, - "[msgpack] (msgpack_serialize_class) " + "[msgpack] (%s) " "\"%s\" returned as member variable from " "__sleep() but does not exist", - Z_STRVAL_PP(name)); + __FUNCTION__, Z_STRVAL_PP(name)); } msgpack_serialize_string( @@ -339,8 +344,9 @@ inline static void msgpack_serialize_array( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_serialize_array) " - "key is not string nor array"); + "[msgpack] (%s) " + "key is not string nor array", + __FUNCTION__); } break; } @@ -361,6 +367,8 @@ inline static void msgpack_serialize_array( Z_ARRVAL_PP(data)->nApplyCount++; } + //php_var_dump(data, 1 TSRMLS_CC); //hoge + msgpack_serialize_zval(buf, *data, var_hash TSRMLS_CC); if (Z_TYPE_PP(data) == IS_ARRAY) @@ -386,6 +394,7 @@ inline static void msgpack_serialize_object( ce = Z_OBJCE_P(val); } +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) if (ce && ce->serialize != NULL) { unsigned char *serialized_data = NULL; @@ -418,6 +427,7 @@ inline static void msgpack_serialize_object( return; } +#endif if (ce && ce != PHP_IC_ENTRY && zend_hash_exists(&ce->function_table, "__sleep", sizeof("__sleep"))) @@ -441,10 +451,11 @@ inline static void msgpack_serialize_object( if (MSGPACK_G(error_display)) { zend_error(E_NOTICE, - "[msgpack] (msgpack_serialize_object) " + "[msgpack] (%s) " "__sleep should return an array only " "containing the names of instance-variables " - "to serialize"); + "to serialize", + __FUNCTION__); } msgpack_pack_nil(buf); } @@ -548,8 +559,8 @@ void msgpack_serialize_zval( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (php_msgpack_serialize) " - "type is unsupported, encoded as null"); + "[msgpack] (%s) type is unsupported, encoded as null", + __FUNCTION__); } msgpack_pack_nil(buf); break; diff --git a/php/msgpack_unpack.c b/php/msgpack_unpack.c index f3b610d2..05b2328d 100644 --- a/php/msgpack_unpack.c +++ b/php/msgpack_unpack.c @@ -19,52 +19,42 @@ typedef struct { zval *data[VAR_ENTRIES_MAX]; long used_slots; - long value_slots; - long access_slots[VAR_ENTRIES_MAX]; - bool alloc_slots[VAR_ENTRIES_MAX]; void *next; } var_entries; -#define MSGPACK_UNSERIALIZE_ALLOC(_unpack) \ - if (_unpack->deps <= 0) { \ - *obj = _unpack->retval; \ - msgpack_var_push(_unpack->var_hash, obj, true, false); \ - } else { \ - ALLOC_INIT_ZVAL(*obj); \ - msgpack_var_push(_unpack->var_hash, obj, false, true); \ +#define MSGPACK_UNSERIALIZE_ALLOC_STACK(_unpack) \ + if (_unpack->deps <= 0) { \ + *obj = _unpack->retval; \ + msgpack_stack_push(_unpack->var_hash, obj, false); \ + } else { \ + ALLOC_INIT_ZVAL(*obj); \ + msgpack_stack_push(_unpack->var_hash, obj, true); \ } -#define MSGPACK_UNSERIALIZE_ALLOC_VALUE(_unpack) \ - if (_unpack->deps <= 0) { \ - *obj = _unpack->retval; \ - msgpack_var_push(_unpack->var_hash, obj, true, false); \ - } else { \ - ALLOC_INIT_ZVAL(*obj); \ - msgpack_var_push(_unpack->var_hash, obj, true, true); \ +#define MSGPACK_UNSERIALIZE_ALLOC_VALUE(_unpack) \ + if (_unpack->deps <= 0) { \ + *obj = _unpack->retval; \ + msgpack_var_push(_unpack->var_hash, obj); \ + } else { \ + ALLOC_INIT_ZVAL(*obj); \ + msgpack_var_push(_unpack->var_hash, obj); \ } -#define MSGPACK_UNSERIALIZE_PUSH_ITEM(_unpack, _count, _val) \ - msgpack_var_alloc(_unpack->var_hash, _count); \ - if (Z_TYPE_P(_val) != IS_ARRAY && Z_TYPE_P(_val) != IS_OBJECT) { \ - msgpack_var_push(_unpack->var_hash, &_val, true, false); \ - } - -#define MSGPACK_UNSERIALIZE_FINISH_ITEM(_unpack) \ - long deps = _unpack->deps - 1; \ - _unpack->stack[deps]--; \ - if (_unpack->stack[deps] == 0) { \ - _unpack->deps--; \ +#define MSGPACK_UNSERIALIZE_FINISH_ITEM(_unpack, _count) \ + msgpack_stack_pop(_unpack->var_hash, _count); \ + long deps = _unpack->deps - 1; \ + _unpack->stack[deps]--; \ + if (_unpack->stack[deps] == 0) { \ + _unpack->deps--; \ } #define MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(_unpack, _key, _val) \ zval_ptr_dtor(&_key); \ zval_ptr_dtor(&_val); \ - msgpack_var_alloc(_unpack->var_hash, 2); \ - MSGPACK_UNSERIALIZE_FINISH_ITEM(_unpack); - + MSGPACK_UNSERIALIZE_FINISH_ITEM(_unpack, 2); inline static void msgpack_var_push( - php_unserialize_data_t *var_hashx, zval **rval, bool value, bool alloc) + php_unserialize_data_t *var_hashx, zval **rval) { var_entries *var_hash, *prev = NULL; @@ -85,7 +75,6 @@ inline static void msgpack_var_push( { var_hash = emalloc(sizeof(var_entries)); var_hash->used_slots = 0; - var_hash->value_slots = 0; var_hash->next = 0; if (!var_hashx->first) @@ -98,45 +87,9 @@ inline static void msgpack_var_push( } } - var_hash->alloc_slots[var_hash->used_slots] = alloc; - - if (value) - { - var_hash->access_slots[var_hash->value_slots++] = var_hash->used_slots; - } - var_hash->data[var_hash->used_slots++] = *rval; } -inline static void msgpack_var_alloc( - php_unserialize_data_t *var_hashx, long count) -{ - long i; - var_entries *var_hash = var_hashx->first; - - while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) - { - var_hash = var_hash->next; - } - - if (!var_hash || count <= 0) - { - return; - } - - for (i = var_hash->used_slots - 1; i >= 0; i--) - { - if (var_hash->alloc_slots[i]) - { - var_hash->alloc_slots[i] = false; - if (--count <= 0) - { - break; - } - } - } -} - inline static int msgpack_var_access( php_unserialize_data_t *var_hashx, long id, zval ***store) { @@ -154,13 +107,6 @@ inline static int msgpack_var_access( return !SUCCESS; } - if (id < 0 || id >= var_hash->value_slots) - { - return !SUCCESS; - } - - id = var_hash->access_slots[id]; - if (id < 0 || id >= var_hash->used_slots) { return !SUCCESS; @@ -171,6 +117,82 @@ inline static int msgpack_var_access( return SUCCESS; } +inline static void msgpack_stack_push( + php_unserialize_data_t *var_hashx, zval **rval, bool save) +{ + var_entries *var_hash, *prev = NULL; + + if (!var_hashx) + { + return; + } + + var_hash = var_hashx->first_dtor; + + while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) + { + prev = var_hash; + var_hash = var_hash->next; + } + + if (!var_hash) + { + var_hash = emalloc(sizeof(var_entries)); + var_hash->used_slots = 0; + var_hash->next = 0; + + if (!var_hashx->first_dtor) + { + var_hashx->first_dtor = var_hash; + } + else + { + prev->next = var_hash; + } + } + + if (save) + { + var_hash->data[var_hash->used_slots++] = *rval; + } + else + { + var_hash->data[var_hash->used_slots++] = NULL; + } +} + +inline static void msgpack_stack_pop( + php_unserialize_data_t *var_hashx, long count) +{ + long i; + var_entries *var_hash = var_hashx->first_dtor; + + while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) + { + var_hash = var_hash->next; + } + + if (!var_hash || count <= 0) + { + return; + } + + for (i = count; i > 0; i--) + { + var_hash->used_slots--; + if (var_hash->used_slots < 0) + { + var_hash->used_slots = 0; + var_hash->data[var_hash->used_slots] = NULL; + break; + } + else + { + var_hash->data[var_hash->used_slots] = NULL; + } + } +} + inline static zend_class_entry* msgpack_unserialize_class( zval **container, char *class_name, size_t name_len) { @@ -210,8 +232,8 @@ inline static zend_class_entry* msgpack_unserialize_class( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_class) " - "defined (%s) but not found", class_name); + "[msgpack] (%s) defined (%s) but not found", + __FUNCTION__, class_name); } incomplete_class = 1; @@ -235,9 +257,9 @@ inline static zend_class_entry* msgpack_unserialize_class( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_class) " + "[msgpack] (%s) " "Function %s() hasn't defined the class " - "it was called for", class_name); + "it was called for", __FUNCTION__, class_name); } incomplete_class = true; @@ -254,8 +276,7 @@ inline static zend_class_entry* msgpack_unserialize_class( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_class) " - "Exception error"); + "[msgpack] (%s) Exception error", __FUNCTION__); } return NULL; @@ -278,7 +299,7 @@ void msgpack_unserialize_var_init(php_unserialize_data_t *var_hashx) var_hashx->first_dtor = 0; } -void msgpack_unserialize_var_destroy(php_unserialize_data_t *var_hashx) +void msgpack_unserialize_var_destroy(php_unserialize_data_t *var_hashx, bool err) { void *next; long i; @@ -286,9 +307,29 @@ void msgpack_unserialize_var_destroy(php_unserialize_data_t *var_hashx) while (var_hash) { - for (i = 0; i < var_hash->used_slots; i++) + if (err) { - if (var_hash->alloc_slots[i] && var_hash->data[i]) + for (i = var_hash->used_slots - 1; i > 0; i--) + { + if (var_hash->data[i]) + { + zval_ptr_dtor(&var_hash->data[i]); + } + } + } + + next = var_hash->next; + efree(var_hash); + var_hash = next; + } + + var_hash = var_hashx->first_dtor; + + while (var_hash) + { + for (i = var_hash->used_slots - 1; i >= 0; i--) + { + if (var_hash->data[i]) { zval_ptr_dtor(&var_hash->data[i]); } @@ -298,21 +339,6 @@ void msgpack_unserialize_var_destroy(php_unserialize_data_t *var_hashx) efree(var_hash); var_hash = next; } - - /* - var_hash = var_hashx->first_dtor; - - while (var_hash) - { - for (i = 0; i < var_hash->used_slots; i++) - { - zval_ptr_dtor(&var_hash->data[i]); - } - next = var_hash->next; - efree(var_hash); - var_hash = next; - } - */ } void msgpack_unserialize_init(msgpack_unserialize_data *unpack) @@ -324,7 +350,7 @@ void msgpack_unserialize_init(msgpack_unserialize_data *unpack) int msgpack_unserialize_uint8( msgpack_unserialize_data *unpack, uint8_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -334,7 +360,7 @@ int msgpack_unserialize_uint8( int msgpack_unserialize_uint16( msgpack_unserialize_data *unpack, uint16_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -344,7 +370,7 @@ int msgpack_unserialize_uint16( int msgpack_unserialize_uint32( msgpack_unserialize_data *unpack, uint32_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -354,7 +380,7 @@ int msgpack_unserialize_uint32( int msgpack_unserialize_uint64( msgpack_unserialize_data *unpack, uint64_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -364,7 +390,7 @@ int msgpack_unserialize_uint64( int msgpack_unserialize_int8( msgpack_unserialize_data *unpack, int8_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -374,7 +400,7 @@ int msgpack_unserialize_int8( int msgpack_unserialize_int16( msgpack_unserialize_data *unpack, int16_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -384,7 +410,7 @@ int msgpack_unserialize_int16( int msgpack_unserialize_int32( msgpack_unserialize_data *unpack, int32_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -394,7 +420,7 @@ int msgpack_unserialize_int32( int msgpack_unserialize_int64( msgpack_unserialize_data *unpack, int64_t data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_LONG(*obj, data); @@ -404,7 +430,7 @@ int msgpack_unserialize_int64( int msgpack_unserialize_float( msgpack_unserialize_data *unpack, float data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_DOUBLE(*obj, data); @@ -414,7 +440,7 @@ int msgpack_unserialize_float( int msgpack_unserialize_double( msgpack_unserialize_data *unpack, double data, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_DOUBLE(*obj, data); @@ -423,7 +449,7 @@ int msgpack_unserialize_double( int msgpack_unserialize_nil(msgpack_unserialize_data *unpack, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_NULL(*obj); @@ -432,7 +458,7 @@ int msgpack_unserialize_nil(msgpack_unserialize_data *unpack, zval **obj) int msgpack_unserialize_true(msgpack_unserialize_data *unpack, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_BOOL(*obj, 1); @@ -441,7 +467,7 @@ int msgpack_unserialize_true(msgpack_unserialize_data *unpack, zval **obj) int msgpack_unserialize_false(msgpack_unserialize_data *unpack, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); ZVAL_BOOL(*obj, 0); @@ -452,7 +478,7 @@ int msgpack_unserialize_raw( msgpack_unserialize_data *unpack, const char* base, const char* data, unsigned int len, zval **obj) { - MSGPACK_UNSERIALIZE_ALLOC(unpack); + MSGPACK_UNSERIALIZE_ALLOC_STACK(unpack); if (len == 0) { @@ -481,11 +507,9 @@ int msgpack_unserialize_array( int msgpack_unserialize_array_item( msgpack_unserialize_data *unpack, zval **container, zval *obj) { - MSGPACK_UNSERIALIZE_PUSH_ITEM(unpack, 1, obj); - add_next_index_zval(*container, obj); - MSGPACK_UNSERIALIZE_FINISH_ITEM(unpack); + MSGPACK_UNSERIALIZE_FINISH_ITEM(unpack, 1); return 0; } @@ -561,14 +585,15 @@ int msgpack_unserialize_map_item( return 0; } +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) /* implementing Serializable */ if (ce->unserialize == NULL) { if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_map_item) " - "Class %s has no unserializer", ce->name); + "[msgpack] (%s) Class %s has no unserializer", + __FUNCTION__, ce->name); } MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val); @@ -580,6 +605,7 @@ int msgpack_unserialize_map_item( container, ce, (const unsigned char *)Z_STRVAL_P(val), Z_STRLEN_P(val) + 1, NULL TSRMLS_CC); +#endif MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val); @@ -590,16 +616,14 @@ int msgpack_unserialize_map_item( zval **rval; unpack->type = MSGPACK_SERIALIZE_TYPE_NONE; - if (msgpack_var_access( unpack->var_hash, Z_LVAL_P(val) - 1, &rval) != SUCCESS) { if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_map_item) " - "Invalid references value: %ld", - Z_LVAL_P(val) - 1); + "[msgpack] (%s) Invalid references value: %ld", + __FUNCTION__, Z_LVAL_P(val) - 1); } MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val); @@ -622,8 +646,6 @@ int msgpack_unserialize_map_item( } } - MSGPACK_UNSERIALIZE_PUSH_ITEM(unpack, 2, val); - if (Z_TYPE_PP(container) != IS_ARRAY && Z_TYPE_PP(container) != IS_OBJECT) { array_init(*container); @@ -640,8 +662,9 @@ int msgpack_unserialize_map_item( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_map_item) " - "illegal offset type, skip this decoding"); + "[msgpack] (%s) " + "illegal offset type, skip this decoding", + __FUNCTION__); } } break; @@ -654,8 +677,9 @@ int msgpack_unserialize_map_item( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_map_item) " - "illegal offset type, skip this decoding"); + "[msgpack] (%s) " + "illegal offset type, skip this decoding", + __FUNCTION__); } } break; @@ -664,13 +688,15 @@ int msgpack_unserialize_map_item( if (MSGPACK_G(error_display)) { zend_error(E_WARNING, - "[msgpack] (msgpack_unserialize_map_item) " - "illegal offset type, skip this decoding"); + "[msgpack] (%s) " + "illegal offset type, skip this decoding", + __FUNCTION__); } break; } zval_ptr_dtor(&key); + msgpack_stack_pop(unpack->var_hash, 2); long deps = unpack->deps - 1; unpack->stack[deps]--; diff --git a/php/msgpack_unpack.h b/php/msgpack_unpack.h index da963ebf..5cc4a5b6 100644 --- a/php/msgpack_unpack.h +++ b/php/msgpack_unpack.h @@ -25,7 +25,8 @@ typedef struct { } msgpack_unserialize_data; void msgpack_unserialize_var_init(php_unserialize_data_t *var_hashx); -void msgpack_unserialize_var_destroy(php_unserialize_data_t *var_hashx); +void msgpack_unserialize_var_destroy( + php_unserialize_data_t *var_hashx, bool err); void msgpack_unserialize_init(msgpack_unserialize_data *unpack); diff --git a/php/package.xml b/php/package.xml index 803aa97d..8ad5c533 100644 --- a/php/package.xml +++ b/php/package.xml @@ -10,11 +10,11 @@ advect@gmail.com yes - 2010-10-26 - + 2010-12-27 + - 0.3.1 - 0.3.1 + 0.3.3 + 0.3.3 beta @@ -26,20 +26,24 @@ - - - - - + + + + + + + + + - - - + + + - + - + @@ -49,61 +53,83 @@ - - + + - + + - - - + + + + + + + - + - - - - - - - - - + + + + + + + + + + + + + + + - + - + + + + - - - - + + + + + + - - - - + + + + + + - - - - - - - - + + + + + + + + + + + + @@ -111,15 +137,18 @@ - - - + + + + + + - 5.2.0 + 5.1.0 1.4.3 diff --git a/php/php-msgpack.spec b/php/php-msgpack.spec index 7609ca45..b3cdd05a 100644 --- a/php/php-msgpack.spec +++ b/php/php-msgpack.spec @@ -3,7 +3,7 @@ Summary: PHP extension for interfacing with MessagePack Name: php-msgpack -Version: 0.3.0 +Version: 0.3.3 Release: 1%{?dist} Source: php-msgpack-%{version}.tar.gz License: New BSD License diff --git a/php/php_msgpack.h b/php/php_msgpack.h index 0791deb4..5010a397 100644 --- a/php/php_msgpack.h +++ b/php/php_msgpack.h @@ -2,7 +2,7 @@ #ifndef PHP_MSGPACK_H #define PHP_MSGPACK_H -#define MSGPACK_EXTENSION_VERSION "0.3.1" +#define MSGPACK_EXTENSION_VERSION "0.3.3" #include "ext/standard/php_smart_str.h" diff --git a/php/tests/009.phpt b/php/tests/009.phpt index a1534c9a..5189e3de 100644 --- a/php/tests/009.phpt +++ b/php/tests/009.phpt @@ -2,8 +2,10 @@ Check for reference serialization --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +a = $a; + $this->b = $b; + $this->c = $c; + } +} + +$o = new Obj(1, 2, 3); + + +test('object', $o, false); +?> +--EXPECTF-- +object +84c0a34f626aa16101a4002a006202a6004f626a006303 +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK diff --git a/php/tests/015.phpt b/php/tests/015.phpt index 634a8b1a..fcd90760 100644 --- a/php/tests/015.phpt +++ b/php/tests/015.phpt @@ -1,6 +1,10 @@ --TEST-- Check for serialization handler --SKIPIF-- += 0) { + echo "skip tests in PHP 5.2 or older"; +} +--FILE-- + +--EXPECT-- +2 +81a3666f6f02 +array(1) { + ["foo"]=> + int(2) +} diff --git a/php/tests/015e.phpt b/php/tests/015e.phpt new file mode 100644 index 00000000..f4434528 --- /dev/null +++ b/php/tests/015e.phpt @@ -0,0 +1,65 @@ +--TEST-- +Check for serialization handler, broken +--SKIPIF-- + +--EXPECT-- +1 +82c001a3666f6f01 +array(1) { + ["foo"]=> + int(1) +} diff --git a/php/tests/015f.phpt b/php/tests/015f.phpt new file mode 100644 index 00000000..fe4278bd --- /dev/null +++ b/php/tests/015f.phpt @@ -0,0 +1,65 @@ +--TEST-- +Check for serialization handler, broken +--SKIPIF-- += 0) { + echo "skip tests in PHP 5.2 or older"; +} +--FILE-- + +--EXPECT-- +1 +81a3666f6f01 +array(1) { + ["foo"]=> + int(1) +} diff --git a/php/tests/016.phpt b/php/tests/016.phpt index f8f4779e..8fe47e88 100644 --- a/php/tests/016.phpt +++ b/php/tests/016.phpt @@ -1,6 +1,10 @@ --TEST-- Object test, __sleep --SKIPIF-- += 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +a = $a; + $this->b = $b; + $this->c = $c; + $this->d = $d; + } + + function __sleep() { + return array('a', 'b', 'c'); + } + +# function __wakeup() { +# $this->d = $this->a + $this->b + $this->c; +# } +} + +$o = new Obj(1, 2, 3, 4); + + +test('object', $o, true); +?> +--EXPECTF-- +object +84c0a34f626aa16101a4002a006202a6004f626a006303 +object(Obj)#%d (4) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + ["d"]=> + NULL +} +OK diff --git a/php/tests/021.phpt b/php/tests/021.phpt index 7960a1f3..137d1007 100644 --- a/php/tests/021.phpt +++ b/php/tests/021.phpt @@ -1,6 +1,10 @@ --TEST-- Object Serializable interface --SKIPIF-- + --FILE-- open('db.txt'); + $res = curl_init('http://php.net/'); +} else { + $test = 'dir'; + $res = opendir('/tmp'); } test('resource', $res, false); @@ -39,11 +33,8 @@ switch ($test) { case 'curl': curl_close($res); break; - case 'sqlite': - if (isset($sqlite)) { - $sqlite->close(); - } - @unlink('db.txt'); + default: + closedir($res); break; } ?> diff --git a/php/tests/024.phpt b/php/tests/024.phpt index 97db2a7d..36c7c250 100644 --- a/php/tests/024.phpt +++ b/php/tests/024.phpt @@ -2,8 +2,10 @@ Recursive objects --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +a = $a; + $this->b = $b; + $this->c = $c; + } +} + +class Obj2 { + public $aa; + protected $bb; + private $cc; + private $obj; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + + $this->obj = new Obj($a, $b, $c); + } +} + +class Obj3 { + private $objs; + + function __construct($a, $b, $c) { + $this->objs = array(); + + for ($i = $a; $i < $c; $i += $b) { + $this->objs[] = new Obj($a, $i, $c); + } + } +} + +class Obj4 { + private $a; + private $obj; + + function __construct($a) { + $this->a = $a; + } + + public function set($obj) { + $this->obj = $obj; + } +} + +$o2 = new Obj2(1, 2, 3); +test('objectrec', $o2, false); + +$o3 = new Obj3(0, 1, 4); +test('objectrecarr', $o3, false); + +$o4 = new Obj4(100); +$o4->set($o4); +test('objectselfrec', $o4, true); +?> +--EXPECTF-- +objectrec +88c0a44f626a32a26161c0a5002a006262c0a8004f626a32006363c0a9004f626a32006f626a84c0a34f626aa16101a4002a006202a6004f626a006303a16101a16202a16303 +object(Obj2)#%d (7) { + ["aa"]=> + NULL + ["bb:protected"]=> + NULL + ["cc:private"]=> + NULL + ["obj:private"]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + ["a"]=> + int(1) + ["b"]=> + int(2) + ["c"]=> + int(3) +} +OK +objectrecarr +82c0a44f626a33aa004f626a33006f626a73840084c0a34f626aa16100a4002a006200a6004f626a0063040184c0a34f626aa16100a4002a006201a6004f626a0063040284c0a34f626aa16100a4002a006202a6004f626a0063040384c0a34f626aa16100a4002a006203a6004f626a006304 +object(Obj3)#%d (1) { + ["objs:private"]=> + array(4) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(0) + ["b:protected"]=> + int(0) + ["c:private"]=> + int(4) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(0) + ["b:protected"]=> + int(1) + ["c:private"]=> + int(4) + } + [2]=> + object(Obj)#%d (3) { + ["a"]=> + int(0) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(4) + } + [3]=> + object(Obj)#%d (3) { + ["a"]=> + int(0) + ["b:protected"]=> + int(3) + ["c:private"]=> + int(4) + } + } +} +OK +objectselfrec +83c0a44f626a34a7004f626a34006164a9004f626a34006f626a82c0020001 +object(Obj4)#%d (2) { + ["a:private"]=> + int(100) + ["obj:private"]=> + object(Obj4)#%d (2) { + ["a:private"]=> + int(100) + ["obj:private"]=> + *RECURSION* + } +} +OK diff --git a/php/tests/025.phpt b/php/tests/025.phpt index 234539d3..cb45a39a 100644 --- a/php/tests/025.phpt +++ b/php/tests/025.phpt @@ -1,6 +1,10 @@ --TEST-- Object test, array of objects with __sleep --SKIPIF-- += 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +a = $a; + $this->b = $b; + $this->c = $c; + $this->d = $d; + } + + function __sleep() { + return array('a', 'b', 'c'); + } + +# function __wakeup() { +# $this->d = $this->a + $this->b + $this->c; +# } +} + +$array = array( + new Obj("aa", "bb", "cc", "dd"), + new Obj("ee", "ff", "gg", "hh"), + new Obj(1, 2, 3, 4), +); + + +test('array', $array, true); +?> +--EXPECTF-- +array(3) { + [0]=> + object(Obj)#1 (4) { + ["a"]=> + string(2) "aa" + ["b:protected"]=> + string(2) "bb" + ["c:private"]=> + string(2) "cc" + ["d"]=> + string(2) "dd" + } + [1]=> + object(Obj)#2 (4) { + ["a"]=> + string(2) "ee" + ["b:protected"]=> + string(2) "ff" + ["c:private"]=> + string(2) "gg" + ["d"]=> + string(2) "hh" + } + [2]=> + object(Obj)#3 (4) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + ["d"]=> + int(4) + } +} +array(3) { + [0]=> + object(Obj)#4 (4) { + ["a"]=> + string(2) "aa" + ["b:protected"]=> + string(2) "bb" + ["c:private"]=> + string(2) "cc" + ["d"]=> + NULL + } + [1]=> + object(Obj)#5 (4) { + ["a"]=> + string(2) "ee" + ["b:protected"]=> + string(2) "ff" + ["c:private"]=> + string(2) "gg" + ["d"]=> + NULL + } + [2]=> + object(Obj)#6 (4) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + ["d"]=> + NULL + } +} diff --git a/php/tests/026.phpt b/php/tests/026.phpt index 383289dd..f7c706c4 100644 --- a/php/tests/026.phpt +++ b/php/tests/026.phpt @@ -3,8 +3,10 @@ Cyclic array test --INI-- --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- --EXPECT-- array -82a16182a162a163a164a165a16683c001a16182a162a163a164a165a16682c0020005 +82a16182a162a163a164a165a16683c001a16182a162a163a164a165a16682c0020003 array(2) { ["a"]=> array(2) { diff --git a/php/tests/026b.phpt b/php/tests/026b.phpt index 9eef7cb9..dd18fa36 100644 --- a/php/tests/026b.phpt +++ b/php/tests/026b.phpt @@ -3,8 +3,13 @@ Cyclic array test --INI-- --SKIPIF-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.1.0') < 0) { + echo "skip tests in PHP 5.1 or newer"; } --FILE-- --EXPECT-- array -82a16182a162a163a164a165a16683c001a16182a162a163a164a165a16682c0020005 +82a16182a162a163a164a165a16683c001a16182a162a163a164a165a16682c0020003 array(2) { ["a"]=> array(2) { diff --git a/php/tests/026d.phpt b/php/tests/026d.phpt new file mode 100644 index 00000000..6a683c97 --- /dev/null +++ b/php/tests/026d.phpt @@ -0,0 +1,147 @@ +--TEST-- +Cyclic array test +--INI-- +--SKIPIF-- += 0) { + echo "skip tests in PHP 5.0 or older"; +} +--FILE-- + array( + 'b' => 'c', + 'd' => 'e' + ), +); + +$a['f'] = &$a; + +test('array', $a, true); + +$a = array("foo" => &$b); +$b = array(1, 2, $a); +var_dump($a); +var_dump($k = msgpack_unserialize(msgpack_serialize($a))); + +$k["foo"][1] = "b"; +var_dump($k); +?> +--EXPECT-- +array +82a16182a162a163a164a165a16682a16182a162a163a164a165a16682a16182a162a163a164a165a166c0 +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + NULL + } + } +} +OK +array(1) { + ["foo"]=> + &array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + array(1) { + ["foo"]=> + &array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + *RECURSION* + } + } + } +} +array(1) { + ["foo"]=> + &array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + array(1) { + ["foo"]=> + &array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + array(1) { + ["foo"]=> + *RECURSION* + } + } + } + } +} +array(1) { + ["foo"]=> + &array(3) { + [0]=> + int(1) + [1]=> + string(1) "b" + [2]=> + array(1) { + ["foo"]=> + &array(3) { + [0]=> + int(1) + [1]=> + string(1) "b" + [2]=> + array(1) { + ["foo"]=> + *RECURSION* + } + } + } + } +} diff --git a/php/tests/027.phpt b/php/tests/027.phpt index c9c7cbd5..3963085f 100644 --- a/php/tests/027.phpt +++ b/php/tests/027.phpt @@ -1,6 +1,10 @@ --TEST-- Check for serialization handler --SKIPIF-- += 0) { + echo "skip tests in PHP 5.2 or older"; +} +--FILE-- + +--EXPECT-- +bool(true) +read +wrote: 82a3666f6f01a474657374a6666f6f626172 +array(2) { + ["foo"]=> + int(1) + ["test"]=> + string(6) "foobar" +} diff --git a/php/tests/028.phpt b/php/tests/028.phpt index 1d326ce1..65fa8db2 100644 --- a/php/tests/028.phpt +++ b/php/tests/028.phpt @@ -2,8 +2,10 @@ Serialize object into session, full set --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- --EXPECTF-- read -write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0020002a70042617200643282c0020002a5002a00643382c0020002a5002a00643282c0020003a2643382c0020003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c002000aa5002a00643282c002000aa2643382c002000aa70042617200643282c002000ba5002a00643382c002000b +write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0020002a70042617200643282c0020002a5002a00643382c0020002a5002a00643282c0020003a2643382c0020003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0020009a5002a00643282c0020009a2643382c0020009a70042617200643282c002000aa5002a00643382c002000a array(3) { ["old"]=> object(Foo)#3 (3) { diff --git a/php/tests/028b.phpt b/php/tests/028b.phpt index 0efba186..d184f4e7 100644 --- a/php/tests/028b.phpt +++ b/php/tests/028b.phpt @@ -2,8 +2,13 @@ Serialize object into session, full set --SKIPIF-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- --EXPECTF-- read -write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0020002a70042617200643282c0020002a5002a00643382c0020002a5002a00643282c0020003a2643382c0020003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c002000aa5002a00643282c002000aa2643382c002000aa70042617200643282c002000ba5002a00643382c002000b +write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0020002a70042617200643282c0020002a5002a00643382c0020002a5002a00643282c0020003a2643382c0020003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0020009a5002a00643282c0020009a2643382c0020009a70042617200643282c002000aa5002a00643382c002000a array(3) { ["old"]=> object(Foo)#3 (3) { diff --git a/php/tests/028c.phpt b/php/tests/028c.phpt new file mode 100644 index 00000000..3e698acd --- /dev/null +++ b/php/tests/028c.phpt @@ -0,0 +1,672 @@ +--TEST-- +Serialize object into session, full set +--SKIPIF-- += 0) { + echo "skip tests in PHP 5.1"; +} +--FILE-- +d1 = $foo; + $this->d2 = $foo; + $this->d3 = $foo; + } +} + +class Bar { + private static $s1 = array(); + protected static $s2 = array(); + public static $s3 = array(); + + public $d1; + private $d2; + protected $d3; + + public function __construct() { + } + + public function set($foo) { + $this->d1 = $foo; + $this->d2 = $foo; + $this->d3 = $foo; + } +} + +$output = ''; + +function open($path, $name) { + return true; +} + +function close() { + return true; +} + +function read($id) { + global $output; + $output .= "read" . PHP_EOL; + $a = new Bar(); + $b = new Foo($a); + $a->set($b); + $session = array('old' => $b); + return msgpack_serialize($session); +} + +function write($id, $data) { + global $output; + $output .= "write: "; + $output .= bin2hex($data) . PHP_EOL; + return true; +} + +function destroy($id) { + return true; +} + +function gc($time) { + return true; +} + +ini_set('session.serialize_handler', 'msgpack'); + +session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc'); + +session_start(); + +$_SESSION['test'] = "foobar"; +$a = new Bar(); +$b = new Foo($a); +$a->set($b); +$_SESSION['new'] = $a; + +session_write_close(); + +echo $output; +var_dump($_SESSION); +?> +--EXPECTF-- +read +write: 83a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0020002a70042617200643282c0020002a5002a00643382c0020002a5002a00643282c0020003a2643382c0020003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0020009a5002a00643282c0020009a2643382c0020009a70042617200643282c002000aa5002a00643382c002000a +array(3) { + ["old"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d2:private"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d3:protected"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d2:private"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d3:protected"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d2:private"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d3:protected"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + } + } + ["test"]=> + string(6) "foobar" + ["new"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d2:protected"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d3"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d2:protected"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d3"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d2:protected"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d3"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + } + } +} diff --git a/php/tests/028d.phpt b/php/tests/028d.phpt new file mode 100644 index 00000000..c316694e --- /dev/null +++ b/php/tests/028d.phpt @@ -0,0 +1,671 @@ +--TEST-- +Serialize object into session, full set +--SKIPIF-- += 0) { + echo "skip tests in PHP 5.0 or older"; +} +--FILE-- +d1 = $foo; + $this->d2 = $foo; + $this->d3 = $foo; + } +} + +class Bar { + private static $s1 = array(); + protected static $s2 = array(); + public static $s3 = array(); + + public $d1; + private $d2; + protected $d3; + + public function __construct() { + } + + public function set($foo) { + $this->d1 = $foo; + $this->d2 = $foo; + $this->d3 = $foo; + } +} + +$output = ''; + +function open($path, $name) { + return true; +} + +function close() { + return true; +} + +function read($id) { + global $output; + $output .= "read" . PHP_EOL; + $a = new Bar(); + $b = new Foo($a); + $a->set($b); + $session = array('old' => $b); + return msgpack_serialize($session); +} + +function write($id, $data) { + global $output; + $output .= "write: "; + $output .= bin2hex($data) . PHP_EOL; + return true; +} + +function destroy($id) { + return true; +} + +function gc($time) { + return true; +} + +ini_set('session.serialize_handler', 'msgpack'); + +session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc'); + +session_start(); + +$_SESSION['test'] = "foobar"; +$a = new Bar(); +$b = new Foo($a); +$a->set($b); +$_SESSION['new'] = $a; + +session_write_close(); + +echo $output; +var_dump($_SESSION); +?> +--EXPECTF-- +read +write: 83a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0020002a70042617200643282c0020002a5002a00643382c0020002a5002a00643282c0020003a2643382c0020003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0020009a5002a00643282c0020009a2643382c0020009a70042617200643282c002000aa5002a00643382c002000a +array(3) { + ["old"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d2:private"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d3:protected"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d2:private"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d3:protected"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d2:private"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + ["d3:protected"]=> + object(Foo)#3 (3) { + ["d1:private"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d2:protected"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + ["d3"]=> + object(Bar)#4 (3) { + ["d1"]=> + *RECURSION* + ["d2:private"]=> + *RECURSION* + ["d3:protected"]=> + *RECURSION* + } + } + } + } + ["test"]=> + string(6) "foobar" + ["new"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d2:protected"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d3"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d2:protected"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d3"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d2:protected"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + ["d3"]=> + object(Bar)#5 (3) { + ["d1"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d2:private"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + ["d3:protected"]=> + object(Foo)#6 (3) { + ["d1:private"]=> + *RECURSION* + ["d2:protected"]=> + *RECURSION* + ["d3"]=> + *RECURSION* + } + } + } + } +} diff --git a/php/tests/031.phpt b/php/tests/031.phpt index ce3ba49f..ce3a7c41 100644 --- a/php/tests/031.phpt +++ b/php/tests/031.phpt @@ -1,6 +1,10 @@ --TEST-- Object Serializable interface throws exceptions --SKIPIF-- +unpack($serialized)) === null) { + return true; + } + + // whole data is read? + if ($serialized !== msgpack_serialize($unserialized)) { + return true; + } + + echo bin2hex($serialized), "\n"; + var_dump($unserialized); + + return false; +} + +mt_srand(0x4c05b583); +for ($i = 0; $i < 100; ++$i) { + if (!test()) break; +} + +?> +--EXPECT-- diff --git a/php/tests/040c.phpt b/php/tests/040c.phpt new file mode 100644 index 00000000..bd882fa6 --- /dev/null +++ b/php/tests/040c.phpt @@ -0,0 +1,53 @@ +--TEST-- +broken random data test : MessagePackUnpacker::feed +--SKIPIF-- +--FILE-- +feed($serialized); + if ($unpacker->execute()) + { + if (($unserialized = $unpacker->data()) === null) { + return true; + } + $unpacker->reset(); + } + else + { + return true; + } + + // whole data is read? + if ($serialized !== msgpack_serialize($unserialized)) { + return true; + } + + echo bin2hex($serialized), "\n"; + var_dump($unserialized); + + return false; +} + +mt_srand(0x4c05b583); +for ($i = 0; $i < 100; ++$i) { + if (!test()) break; +} + +?> +--EXPECT-- diff --git a/php/tests/040d.phpt b/php/tests/040d.phpt new file mode 100644 index 00000000..de4c01d8 --- /dev/null +++ b/php/tests/040d.phpt @@ -0,0 +1,52 @@ +--TEST-- +broken random data test : MessagePackUnpacker::execute +--SKIPIF-- +--FILE-- +execute($serialized, $offset)) + { + if (($unserialized = $unpacker->data()) === null) { + return true; + } + $unpacker->reset(); + } + else + { + return true; + } + + // whole data is read? + if ($serialized !== msgpack_serialize($unserialized)) { + return true; + } + + echo bin2hex($serialized), "\n"; + var_dump($unserialized); + + return false; +} + +mt_srand(0x4c05b583); +for ($i = 0; $i < 100; ++$i) { + if (!test()) break; +} + +?> +--EXPECT-- diff --git a/php/tests/060.phpt b/php/tests/060.phpt index 3ea97eb9..c210fa99 100644 --- a/php/tests/060.phpt +++ b/php/tests/060.phpt @@ -2,8 +2,10 @@ Check for buffered streaming unserialization --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +feed($str); + if ($unpacker->execute()) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + $unpacker->reset(); + } + + $i += $len; + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('bool: true', true); +test('bool: false', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('array', array(), false); +test('array(1, 2, 3)', array(1, 2, 3), false); +test('array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/061.phpt b/php/tests/061.phpt index 2b42d310..e67774b2 100644 --- a/php/tests/061.phpt +++ b/php/tests/061.phpt @@ -2,8 +2,10 @@ Check for unbuffered streaming unserialization --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +execute($str, $offset)) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + + $unpacker->reset(); + $str = ""; + $offset = 0; + } + + $i += $len; + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/064.phpt b/php/tests/064.phpt index a7a2f3bc..bbaffe9c 100644 --- a/php/tests/064.phpt +++ b/php/tests/064.phpt @@ -2,8 +2,10 @@ Check for buffered streaming unserialization (single) --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +feed($str); + if ($unpacker->execute()) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + $unpacker->reset(); + } + + $i += $len; + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('bool: true', true); +test('bool: false', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('array', array(), false); +test('array(1, 2, 3)', array(1, 2, 3), false); +test('array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/065.phpt b/php/tests/065.phpt index c37ca129..8139f24e 100644 --- a/php/tests/065.phpt +++ b/php/tests/065.phpt @@ -2,8 +2,10 @@ Check for unbuffered streaming unserialization (single) --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +execute($str, $offset)) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + + $unpacker->reset(); + $str = ""; + $offset = 0; + } + + $i += $len; + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/070.phpt b/php/tests/070.phpt index affcc729..fd915fd6 100644 --- a/php/tests/070.phpt +++ b/php/tests/070.phpt @@ -2,8 +2,10 @@ Check for alias functions --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- + 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/071.phpt b/php/tests/071.phpt index 20041d40..bc64c60d 100644 --- a/php/tests/071.phpt +++ b/php/tests/071.phpt @@ -2,8 +2,10 @@ Check for class methods --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +pack($variable); + $unserialized = $msgpack->unpack($serialized); + + var_dump($unserialized); + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/072.phpt b/php/tests/072.phpt index 0f89e0ac..348bd34b 100644 --- a/php/tests/072.phpt +++ b/php/tests/072.phpt @@ -2,8 +2,10 @@ Check for class methods unpacker --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +pack($variable); + $unpacker = $msgpack->unpacker(); + + $length = strlen($serialized); + + if (rand(0, 1)) + { + for ($i = 0; $i < $length;) { + $len = rand(1, 10); + $str = substr($serialized, $i, $len); + + $unpacker->feed($str); + if ($unpacker->execute()) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + $unpacker->reset(); + } + + $i += $len; + } + } + else + { + $str = ""; + $offset = 0; + + for ($i = 0; $i < $length;) { + $len = rand(1, 10); + $str .= substr($serialized, $i, $len); + + if ($unpacker->execute($str, $offset)) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + + $unpacker->reset(); + $str = ""; + $offset = 0; + } + + $i += $len; + } + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/073.phpt b/php/tests/073.phpt index f6a91a66..c1eb9f49 100644 --- a/php/tests/073.phpt +++ b/php/tests/073.phpt @@ -2,8 +2,10 @@ Check for class unpacker --SKIPIF-- = 0 && + version_compare(PHP_VERSION, '5.3.2') <= 0)) { + echo "skip tests in PHP 5.2.14/5.3.3 or newer"; } --FILE-- = 0) { - echo "skip tests in PHP 5.3.2 or older"; +if ((version_compare(PHP_VERSION, '5.3.0') < 0 && + version_compare(PHP_VERSION, '5.2.14') >= 0) || + (version_compare(PHP_VERSION, '5.3.3') >= 0)) { + echo "skip tests in PHP 5.2.13/5.3.2 or older"; +} +if (version_compare(PHP_VERSION, '5.2.0') < 0) { + echo "skip tests in PHP 5.2 or newer"; } --FILE-- = 0) { + echo "skip tests in PHP 5.1 or older"; +} +--FILE-- +pack($variable); + + $unpacker = new MessagePackUnpacker(); + + $length = strlen($serialized); + + if (rand(0, 1)) + { + for ($i = 0; $i < $length;) { + $len = rand(1, 10); + $str = substr($serialized, $i, $len); + + $unpacker->feed($str); + if ($unpacker->execute()) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + $unpacker->reset(); + } + + $i += $len; + } + } + else + { + $str = ""; + $offset = 0; + + for ($i = 0; $i < $length;) { + $len = rand(1, 10); + $str .= substr($serialized, $i, $len); + + if ($unpacker->execute($str, $offset)) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + + $unpacker->reset(); + $str = ""; + $offset = 0; + } + + $i += $len; + } + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), false); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), false); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + &array(1) { + [0]=> + string(3) "foo" + } + [1]=> + &array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) +} +OK +array(2) { + [0]=> + object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + object(Obj)#%d (3) { + ["a"]=> + int(4) + ["b:protected"]=> + int(5) + ["c:private"]=> + int(6) + } +} +OK +array(2) { + [0]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } + [1]=> + &object(Obj)#%d (3) { + ["a"]=> + int(1) + ["b:protected"]=> + int(2) + ["c:private"]=> + int(3) + } +} +OK diff --git a/php/tests/087.phpt b/php/tests/087.phpt index 9bb4e49a..a7386a18 100644 --- a/php/tests/087.phpt +++ b/php/tests/087.phpt @@ -1,6 +1,10 @@ --TEST-- disabled php only for class methods (set option) --SKIPIF-- += 0) { + echo "skip tests in PHP 5.0 or older"; +} +--FILE-- +setOption(MESSAGEPACK_OPT_PHPONLY, false); + + $serialized = $msgpack->pack($variable); + $unserialized = $msgpack->unpack($serialized); + + var_dump($unserialized); + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), true); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), true); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), true); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + NULL + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(2) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } +} +OK +array(2) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } +} +OK diff --git a/php/tests/088.phpt b/php/tests/088.phpt index 7cbabb91..1d44fd3f 100644 --- a/php/tests/088.phpt +++ b/php/tests/088.phpt @@ -1,6 +1,10 @@ --TEST-- disabled php only for class methods unpacker (set option) --SKIPIF-- += 0) { + echo "skip tests in PHP 5.1.0 or older"; +} +--FILE-- +setOption(MESSAGEPACK_OPT_PHPONLY, false); + + $serialized = $msgpack->pack($variable); + $unpacker = $msgpack->unpacker(); + + $length = strlen($serialized); + + if (rand(0, 1)) + { + for ($i = 0; $i < $length;) + { + $len = rand(1, 10); + $str = substr($serialized, $i, $len); + + $unpacker->feed($str); + if ($unpacker->execute()) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + $unpacker->reset(); + } + + $i += $len; + } + } + else + { + $str = ""; + $offset = 0; + + for ($i = 0; $i < $length;) + { + $len = rand(1, 10); + $str .= substr($serialized, $i, $len); + + if ($unpacker->execute($str, $offset)) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + + $unpacker->reset(); + $str = ""; + $offset = 0; + } + + $i += $len; + } + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), true); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), true); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), true); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + NULL + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(2) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } +} +OK +array(2) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } +} +OK diff --git a/php/tests/089.phpt b/php/tests/089.phpt index f3a05378..77be7071 100644 --- a/php/tests/089.phpt +++ b/php/tests/089.phpt @@ -1,6 +1,10 @@ --TEST-- disabled php only for class unpacker (set option) --SKIPIF-- += 0) { + echo "skip tests in PHP 5.0 or older"; +} +--FILE-- +setOption(MESSAGEPACK_OPT_PHPONLY, false); + + $serialized = $msgpack->pack($variable); + + $unpacker = new MessagePackUnpacker(); + $unpacker->setOption(MESSAGEPACK_OPT_PHPONLY, false); + + $length = strlen($serialized); + + if (rand(0, 1)) + { + for ($i = 0; $i < $length;) + { + $len = rand(1, 10); + $str = substr($serialized, $i, $len); + + $unpacker->feed($str); + if ($unpacker->execute()) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + $unpacker->reset(); + } + + $i += $len; + } + } + else + { + $str = ""; + $offset = 0; + + for ($i = 0; $i < $length;) + { + $len = rand(1, 10); + $str .= substr($serialized, $i, $len); + + if ($unpacker->execute($str, $offset)) + { + $unserialized = $unpacker->data(); + var_dump($unserialized); + + $unpacker->reset(); + $str = ""; + $offset = 0; + } + + $i += $len; + } + } + + if (!is_bool($test)) + { + echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL; + } + else + { + echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; + } +} + +test('null', null); + +test('boo:l true', true); +test('bool: true', false); + +test('zero: 0', 0); +test('small: 1', 1); +test('small: -1', -1); +test('medium: 1000', 1000); +test('medium: -1000', -1000); +test('large: 100000', 100000); +test('large: -100000', -100000); + +test('double: 123.456', 123.456); + +test('empty: ""', ""); +test('string: "foobar"', "foobar"); + +test('empty: array', array(), false); +test('empty: array(1, 2, 3)', array(1, 2, 3), false); +test('empty: array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false); + +test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false); +test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false); +test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false); +test('array("" => "empty")', array("" => "empty"), false); + +$a = array('foo'); +test('array($a, $a)', array($a, $a), false); +test('array(&$a, &$a)', array(&$a, &$a), false); + +$a = array(null); +$b = array(&$a); +$a[0] = &$b; + +test('cyclic', $a, true); + +$a = array( + 'a' => array( + 'b' => 'c', + 'd' => 'e' + ), + 'f' => array( + 'g' => 'h' + ) + ); + +test('array', $a, false); + +class Obj { + public $a; + protected $b; + private $c; + + function __construct($a, $b, $c) { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } +} + +test('object', new Obj(1, 2, 3), true); + +test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), true); + +$o = new Obj(1, 2, 3); + +test('object', array(&$o, &$o), true); +--EXPECTF-- +NULL +OK +bool(true) +OK +bool(false) +OK +int(0) +OK +int(1) +OK +int(-1) +OK +int(1000) +OK +int(-1000) +OK +int(100000) +OK +int(-100000) +OK +float(123.456) +OK +string(0) "" +OK +string(6) "foobar" +OK +array(0) { +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(3) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [2]=> + array(3) { + [0]=> + int(7) + [1]=> + int(8) + [2]=> + int(9) + } +} +OK +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "foo" + [2]=> + string(3) "foo" +} +OK +array(2) { + ["one"]=> + int(1) + ["two"]=> + int(2) +} +OK +array(2) { + ["kek"]=> + string(3) "lol" + ["lol"]=> + string(3) "kek" +} +OK +array(1) { + [""]=> + string(5) "empty" +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(2) { + [0]=> + array(1) { + [0]=> + string(3) "foo" + } + [1]=> + array(1) { + [0]=> + string(3) "foo" + } +} +OK +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + NULL + } + } + } + } +} +OK +array(2) { + ["a"]=> + array(2) { + ["b"]=> + string(1) "c" + ["d"]=> + string(1) "e" + } + ["f"]=> + array(1) { + ["g"]=> + string(1) "h" + } +} +OK +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +OK +array(2) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } +} +OK +array(2) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } +} +OK