From 75b07963e3ff7578bb20564ec9a2094ebb0c3493 Mon Sep 17 00:00:00 2001 From: Mark Karpeles Date: Thu, 20 Nov 2008 15:55:00 +0000 Subject: [PATCH] - MFH: ext/wddx: classes providing __sleep() are stored without properties (fixed) - ext/wddx: fixed wddx_add_vars() ignoring first var in php 5.3 --- ext/wddx/tests/002.phpt | 21 ++++++++++++ ext/wddx/tests/003.phpt | 26 +++++++++++++++ ext/wddx/tests/004.phpt | 63 +++++++++++++++++++++++++++++++++++ ext/wddx/tests/005.phpt | 74 +++++++++++++++++++++++++++++++++++++++++ ext/wddx/wddx.c | 16 +++++---- 5 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 ext/wddx/tests/002.phpt create mode 100644 ext/wddx/tests/003.phpt create mode 100644 ext/wddx/tests/004.phpt create mode 100644 ext/wddx/tests/005.phpt diff --git a/ext/wddx/tests/002.phpt b/ext/wddx/tests/002.phpt new file mode 100644 index 0000000000..692bfa85c6 --- /dev/null +++ b/ext/wddx/tests/002.phpt @@ -0,0 +1,21 @@ +--TEST-- +wddx packet construction using wddx ressource +--SKIPIF-- + +--INI-- +precision=14 +--FILE-- + +--EXPECT-- +
TEST comment
some string756
diff --git a/ext/wddx/tests/003.phpt b/ext/wddx/tests/003.phpt new file mode 100644 index 0000000000..3240e43e92 --- /dev/null +++ b/ext/wddx/tests/003.phpt @@ -0,0 +1,26 @@ +--TEST-- +wddx deserialize from ressource +--SKIPIF-- + +--INI-- +precision=14 +--FILE-- +
TEST comment
some string756"); + rewind($fp); + var_dump(wddx_deserialize($fp)); + fclose($fp); +?> +--EXPECT-- +array(4) { + ["var1"]=> + NULL + ["var2"]=> + string(11) "some string" + ["var3"]=> + int(756) + ["var4"]=> + bool(true) +} diff --git a/ext/wddx/tests/004.phpt b/ext/wddx/tests/004.phpt new file mode 100644 index 0000000000..ae5a6b4bd5 --- /dev/null +++ b/ext/wddx/tests/004.phpt @@ -0,0 +1,63 @@ +--TEST-- +wddx session serializer handler (serialize) +--SKIPIF-- + +--INI-- +precision=14 +session.serialize_handler=wddx +session.use_cookies=0 +session.cache_limiter= +session.save_handler=files +--FILE-- +yes = "done"; } + + public function __sleep() { return array('bar', 'yes'); } + } + + session_start(); + + $_SESSION['data'] = array( + 'test1' => true, + 'test2' => 'some string', + 'test3' => 654321, + 'test4' => array( + 'some string', + true, + null + ), + ); + + $_SESSION['class'] = new foo(); + $_SESSION['class']->method(); + + var_dump(session_encode()); + + session_destroy(); +?> +--EXPECT-- +string(550) "
some string654321some stringfoookdone" diff --git a/ext/wddx/tests/005.phpt b/ext/wddx/tests/005.phpt new file mode 100644 index 0000000000..99e7a9e31f --- /dev/null +++ b/ext/wddx/tests/005.phpt @@ -0,0 +1,74 @@ +--TEST-- +wddx session serializer handler (deserialize) +--SKIPIF-- + +--INI-- +precision=14 +session.serialize_handler=wddx +session.use_cookies=0 +session.cache_limiter= +session.save_handler=files +--FILE-- +yes = "done"; } + } + + session_start(); + + session_decode("
some string654321some stringfoookdone"); + + var_dump($_SESSION); + + session_destroy(); +?> +--EXPECT-- +array(2) { + ["data"]=> + array(4) { + ["test1"]=> + bool(true) + ["test2"]=> + string(11) "some string" + ["test3"]=> + int(654321) + ["test4"]=> + array(3) { + [0]=> + string(11) "some string" + [1]=> + bool(true) + [2]=> + NULL + } + } + ["class"]=> + object(foo)#1 (2) { + ["bar"]=> + string(2) "ok" + ["yes"]=> + string(4) "done" + } +} diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c index a4dfdcbd4d..42db979a6e 100644 --- a/ext/wddx/wddx.c +++ b/ext/wddx/wddx.c @@ -460,7 +460,7 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj) char *key; ulong idx; char tmp_buf[WDDX_BUF_LEN]; - HashTable *objhash; + HashTable *objhash, *sleephash; TSRMLS_FETCH(); MAKE_STD_ZVAL(fname); @@ -471,7 +471,7 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj) * array of property names to be serialized. */ if (call_user_function_ex(CG(function_table), &obj, fname, &retval, 0, 0, 1, NULL TSRMLS_CC) == SUCCESS) { - if (retval && (objhash = HASH_OF(retval))) { + if (retval && (sleephash = HASH_OF(retval))) { PHP_CLASS_ATTRIBUTES; PHP_SET_CLASS_ATTRIBUTES(obj); @@ -485,10 +485,12 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj) php_wddx_add_chunk_static(packet, WDDX_VAR_E); PHP_CLEANUP_CLASS_ATTRIBUTES(); + + objhash = HASH_OF(obj); - for (zend_hash_internal_pointer_reset(objhash); - zend_hash_get_current_data(objhash, (void **)&varname) == SUCCESS; - zend_hash_move_forward(objhash)) { + for (zend_hash_internal_pointer_reset(sleephash); + zend_hash_get_current_data(sleephash, (void **)&varname) == SUCCESS; + zend_hash_move_forward(sleephash)) { if (Z_TYPE_PP(varname) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "__sleep should return an array only containing the names of instance-variables to serialize."); continue; @@ -692,7 +694,7 @@ static void php_wddx_add_var(wddx_packet *packet, zval *name_var) zval **val; HashTable *target_hash; TSRMLS_FETCH(); - + if (Z_TYPE_P(name_var) == IS_STRING) { if (!EG(active_symbol_table)) { zend_rebuild_symbol_table(TSRMLS_C); @@ -1288,7 +1290,7 @@ PHP_FUNCTION(wddx_add_vars) RETURN_FALSE; } - for (i=1; i