diff --git a/php/ChangeLog b/php/ChangeLog
index c02ab1f3..e409478b 100644
--- a/php/ChangeLog
+++ b/php/ChangeLog
@@ -1,5 +1,20 @@
msgpack extension changelog
+Version 0.5.0
+-------------
+ * Fix ZEND_DECLARE_MODULE_GLOBALS:
+ Moved ZEND_DECLARE_MODULE_GLOBALS from header to source file.
+ Added ZEND_EXTERN_MODULE_GLOBALS in source files to avoid undefined
+ _msgpack_globals message.
+ (Contributed by seporaitis)
+ * Add unpack of template converter:
+ Merge https://github.com/msgpack/msgpack/pull/58
+ Fixed memory leaks.
+ Fixed older version.
+ Fixed tests scripts.
+ Added msgpack_unpack function was implemented.
+ (Contributed by ivan)
+
Version 0.4.0
-------------
* Fix array pack.
diff --git a/php/msgpack.c b/php/msgpack.c
index 6e9253a7..1cc3dc05 100644
--- a/php/msgpack.c
+++ b/php/msgpack.c
@@ -19,6 +19,8 @@
#include "msgpack_errors.h"
#include "msgpack/version.h"
+ZEND_DECLARE_MODULE_GLOBALS(msgpack)
+
static ZEND_FUNCTION(msgpack_serialize);
static ZEND_FUNCTION(msgpack_unserialize);
@@ -322,7 +324,7 @@ static ZEND_FUNCTION(msgpack_unserialize)
ALLOC_INIT_ZVAL(zv);
php_msgpack_unserialize(zv, str, str_len TSRMLS_CC);
- if (msgpack_convert_object(return_value, object, &zv) != SUCCESS)
+ if (msgpack_convert_template(return_value, object, &zv) != SUCCESS)
{
RETURN_NULL();
}
diff --git a/php/msgpack_class.c b/php/msgpack_class.c
index 3cd21a35..f90d6d2d 100644
--- a/php/msgpack_class.c
+++ b/php/msgpack_class.c
@@ -359,7 +359,7 @@ static ZEND_METHOD(msgpack, unpack)
ALLOC_INIT_ZVAL(zv);
php_msgpack_unserialize(zv, str, str_len TSRMLS_CC);
- if (msgpack_convert_object(return_value, object, &zv) != SUCCESS)
+ if (msgpack_convert_template(return_value, object, &zv) != SUCCESS)
{
RETURN_NULL();
}
diff --git a/php/msgpack_convert.c b/php/msgpack_convert.c
index 47092836..f7f3d3c2 100644
--- a/php/msgpack_convert.c
+++ b/php/msgpack_convert.c
@@ -38,11 +38,16 @@ inline int msgpack_convert_long_to_properties(
HashTable *ht, HashTable **properties, HashPosition *prop_pos,
uint key_index, zval *val, HashTable *var)
{
+ TSRMLS_FETCH();
+
if (*properties != NULL)
{
char *prop_key;
uint prop_key_len;
ulong prop_key_index;
+ zval **data = NULL;
+ zval *tplval = NULL;
+ zval **dataval = NULL;
for (;; zend_hash_move_forward_ex(*properties, prop_pos))
{
@@ -53,10 +58,67 @@ inline int msgpack_convert_long_to_properties(
if (var == NULL ||
!zend_hash_exists(var, prop_key, prop_key_len))
{
- zend_hash_move_forward_ex(*properties, prop_pos);
- return zend_symtable_update(
- ht, prop_key, prop_key_len,
- &val, sizeof(val), NULL);
+ if (zend_hash_find(
+ ht, prop_key, prop_key_len,
+ (void **)&data) == SUCCESS)
+ {
+ switch (Z_TYPE_PP(data))
+ {
+ case IS_ARRAY:
+ {
+ HashTable *dataht;
+ dataht = HASH_OF(val);
+ if (zend_hash_index_find(
+ dataht, prop_key_index,
+ (void **)dataval) != SUCCESS)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) "
+ "can't get data value by index",
+ __FUNCTION__);
+ return FAILURE;
+ }
+
+ ALLOC_INIT_ZVAL(tplval);
+ if (msgpack_convert_array(
+ tplval, *data, dataval) == SUCCESS)
+ {
+ zend_hash_move_forward_ex(
+ *properties, prop_pos);
+
+ return zend_symtable_update(
+ ht, prop_key, prop_key_len,
+ &tplval, sizeof(tplval), NULL);
+ }
+ // TODO: de we need to call dtor?
+ return FAILURE;
+ break;
+ }
+ case IS_OBJECT:
+ {
+ ALLOC_INIT_ZVAL(tplval);
+ if (msgpack_convert_object(
+ tplval, *data, &val) == SUCCESS)
+ {
+ zend_hash_move_forward_ex(
+ *properties, prop_pos);
+
+ return zend_symtable_update(
+ ht, prop_key, prop_key_len,
+ &tplval, sizeof(tplval), NULL);
+ }
+ // TODO: de we need to call dtor?
+ return FAILURE;
+ break;
+ }
+ default:
+ zend_hash_move_forward_ex(*properties, prop_pos);
+ return zend_symtable_update(
+ ht, prop_key, prop_key_len,
+ &val, sizeof(val), NULL);
+ break;
+ }
+ }
}
}
else
@@ -108,31 +170,286 @@ inline int msgpack_convert_string_to_properties(
return FAILURE;
}
-int msgpack_convert_object(zval *return_value, zval *object, zval **value)
+int msgpack_convert_array(zval *return_value, zval *tpl, zval **value)
{
- zend_class_entry *ce, **pce;
- HashTable *properties = NULL;
- HashPosition prop_pos;
TSRMLS_FETCH();
- switch (Z_TYPE_P(object))
+ if (Z_TYPE_P(tpl) == IS_ARRAY)
+ {
+ char *key;
+ uint key_len;
+ int key_type;
+ ulong key_index;
+ zval **data, **arydata;
+ HashPosition pos, valpos;
+ HashTable *ht, *htval;
+ int num;
+
+ ht = HASH_OF(tpl);
+ // TODO: maybe need to release memory?
+ array_init(return_value);
+
+ num = zend_hash_num_elements(ht);
+ if (num <= 0)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) template array length is 0",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ /* string */
+ if (ht->nNumOfElements != ht->nNextFreeElement)
+ {
+ htval = HASH_OF(*value);
+ if (!htval)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) input data is not array",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ zend_hash_internal_pointer_reset_ex(ht, &pos);
+ zend_hash_internal_pointer_reset_ex(htval, &valpos);
+ for (;; zend_hash_move_forward_ex(ht, &pos),
+ zend_hash_move_forward_ex(htval, &valpos))
+ {
+ key_type = zend_hash_get_current_key_ex(
+ ht, &key, &key_len, &key_index, 0, &pos);
+
+ if (key_type == HASH_KEY_NON_EXISTANT)
+ {
+ break;
+ }
+
+ if (zend_hash_get_current_data_ex(
+ ht, (void *)&data, &pos) != SUCCESS)
+ {
+ continue;
+ }
+
+ if (key_type == HASH_KEY_IS_STRING)
+ {
+ int (*convert_function)(zval *, zval *, zval **) = NULL;
+ zval **dataval, *val;
+
+ switch (Z_TYPE_PP(data))
+ {
+ case IS_ARRAY:
+ convert_function = msgpack_convert_array;
+ break;
+ case IS_OBJECT:
+ // case IS_STRING:
+ convert_function = msgpack_convert_object;
+ break;
+ default:
+ break;
+ }
+
+ if (zend_hash_get_current_data_ex(
+ htval, (void *)&dataval, &valpos) != SUCCESS)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) can't get data",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ MSGPACK_CONVERT_COPY_ZVAL(val, dataval);
+
+ if (convert_function)
+ {
+ zval *rv;
+ ALLOC_INIT_ZVAL(rv);
+ if (convert_function(rv, *data, &val) != SUCCESS)
+ {
+ zval_ptr_dtor(&val);
+ return FAILURE;
+ }
+ add_assoc_zval_ex(return_value, key, key_len, rv);
+ }
+ else
+ {
+ add_assoc_zval_ex(return_value, key, key_len, val);
+ }
+ }
+ }
+
+ zval_ptr_dtor(value);
+
+ return SUCCESS;
+ }
+ else
+ {
+ /* index */
+ int (*convert_function)(zval *, zval *, zval **) = NULL;
+
+ if (Z_TYPE_PP(value) != IS_ARRAY)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) unserialized data must be array.",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ zend_hash_internal_pointer_reset_ex(ht, &pos);
+
+ key_type = zend_hash_get_current_key_ex(
+ ht, &key, &key_len, &key_index, 0, &pos);
+
+ if (key_type == HASH_KEY_NON_EXISTANT)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) first element in template array is empty",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ if (zend_hash_get_current_data_ex(
+ ht, (void *)&data, &pos) != SUCCESS)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) invalid template: empty array?",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ switch (Z_TYPE_PP(data))
+ {
+ case IS_ARRAY:
+ convert_function = msgpack_convert_array;
+ break;
+ case IS_OBJECT:
+ case IS_STRING:
+ convert_function = msgpack_convert_object;
+ break;
+ default:
+ break;
+ }
+
+ htval = HASH_OF(*value);
+ num = zend_hash_num_elements(htval);
+ if (num <= 0)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) array length is 0 in unserialized data",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ zend_hash_internal_pointer_reset_ex(htval, &valpos);
+ for (;; zend_hash_move_forward_ex(htval, &valpos))
+ {
+ key_type = zend_hash_get_current_key_ex(
+ htval, &key, &key_len, &key_index, 0, &valpos);
+
+ if (key_type == HASH_KEY_NON_EXISTANT)
+ {
+ break;
+ }
+
+ if (zend_hash_get_current_data_ex(
+ htval, (void *)&arydata, &valpos) != SUCCESS)
+ {
+ MSGPACK_WARNING(
+ "[msgpack] (%s) can't get next data in indexed array",
+ __FUNCTION__);
+ continue;
+ }
+
+ switch (key_type)
+ {
+ case HASH_KEY_IS_LONG:
+ {
+ zval *aryval, *rv;
+ ALLOC_INIT_ZVAL(rv);
+ MSGPACK_CONVERT_COPY_ZVAL(aryval, arydata);
+ if (convert_function)
+ {
+ if (convert_function(rv, *data, &aryval) != SUCCESS)
+ {
+ zval_ptr_dtor(&aryval);
+ MSGPACK_WARNING(
+ "[msgpack] (%s) "
+ "convert failure in HASH_KEY_IS_LONG "
+ "in indexed array",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+ add_next_index_zval(return_value, rv);
+ }
+ else
+ {
+ add_next_index_zval(return_value, aryval);
+ }
+ break;
+ }
+ case HASH_KEY_IS_STRING:
+ MSGPACK_WARNING(
+ "[msgpack] (%s) key is string",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ default:
+ MSGPACK_WARNING(
+ "[msgpack] (%s) key is not string nor array",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+ }
+
+ zval_ptr_dtor(value);
+ return SUCCESS;
+ }
+ }
+ else
+ {
+ // shouldn't reach
+ MSGPACK_WARNING(
+ "[msgpack] (%s) template is not array",
+ __FUNCTION__);
+ zval_ptr_dtor(value);
+ return FAILURE;
+ }
+
+ // shouldn't reach
+ zval_ptr_dtor(value);
+ return FAILURE;
+}
+
+int msgpack_convert_object(zval *return_value, zval *tpl, zval **value)
+{
+ zend_class_entry *ce, **pce;
+ TSRMLS_FETCH();
+
+ switch (Z_TYPE_P(tpl))
{
case IS_STRING:
if (zend_lookup_class(
- Z_STRVAL_P(object), Z_STRLEN_P(object),
+ Z_STRVAL_P(tpl), Z_STRLEN_P(tpl),
&pce TSRMLS_CC) != SUCCESS)
{
MSGPACK_ERROR("[msgpack] (%s) Class '%s' not found",
- __FUNCTION__, Z_STRVAL_P(object));
+ __FUNCTION__, Z_STRVAL_P(tpl));
return FAILURE;
}
ce = *pce;
break;
case IS_OBJECT:
- ce = zend_get_class_entry(object TSRMLS_CC);
+ ce = zend_get_class_entry(tpl TSRMLS_CC);
break;
default:
- MSGPACK_ERROR("[msgpack] (%s) Object type is unsupported",
+ MSGPACK_ERROR("[msgpack] (%s) object type is unsupported",
__FUNCTION__);
return FAILURE;
}
@@ -152,13 +469,76 @@ int msgpack_convert_object(zval *return_value, zval *object, zval **value)
}
object_init_ex(return_value, ce);
- properties = Z_OBJ_HT_P(return_value)->get_properties(
- return_value TSRMLS_CC);
- if (HASH_OF(object))
+
+ /* Run the constructor if there is one */
+ if (ce->constructor
+ && (ce->constructor->common.fn_flags & ZEND_ACC_PUBLIC))
{
- properties = HASH_OF(object);
+ zval *retval_ptr = NULL;
+ zval ***params = NULL;
+ int num_args = 0;
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcc;
+
+#if ZEND_MODULE_API_NO >= 20090626
+ fci.size = sizeof(fci);
+ fci.function_table = EG(function_table);
+ fci.function_name = NULL;
+ fci.symbol_table = NULL;
+ fci.object_ptr = return_value;
+ fci.retval_ptr_ptr = &retval_ptr;
+ fci.param_count = num_args;
+ fci.params = params;
+ fci.no_separation = 1;
+
+ fcc.initialized = 1;
+ fcc.function_handler = ce->constructor;
+ fcc.calling_scope = EG(scope);
+ fcc.called_scope = Z_OBJCE_P(return_value);
+ fcc.object_ptr = return_value;
+#else
+ fci.size = sizeof(fci);
+ fci.function_table = EG(function_table);
+ fci.function_name = NULL;
+ fci.symbol_table = NULL;
+ fci.object_pp = &return_value;
+ fci.retval_ptr_ptr = &retval_ptr;
+ fci.param_count = num_args;
+ fci.params = params;
+ fci.no_separation = 1;
+
+ fcc.initialized = 1;
+ fcc.function_handler = ce->constructor;
+ fcc.calling_scope = EG(scope);
+ fcc.object_pp = &return_value;
+#endif
+
+ if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE)
+ {
+ if (params)
+ {
+ efree(params);
+ }
+ if (retval_ptr)
+ {
+ zval_ptr_dtor(&retval_ptr);
+ }
+
+ MSGPACK_WARNING(
+ "[msgpack] (%s) Invocation of %s's constructor failed",
+ __FUNCTION__, ce->name);
+
+ return FAILURE;
+ }
+ if (retval_ptr)
+ {
+ zval_ptr_dtor(&retval_ptr);
+ }
+ if (params)
+ {
+ efree(params);
+ }
}
- zend_hash_internal_pointer_reset_ex(properties, &prop_pos);
switch (Z_TYPE_PP(value))
{
@@ -184,12 +564,16 @@ int msgpack_convert_object(zval *return_value, zval *object, zval **value)
break;
}
- ALLOC_HASHTABLE(var);
- zend_hash_init(var, num, NULL, NULL, 0);
-
- /* string */
- if (ht->nNumOfElements != ht->nNextFreeElement)
+ /* string - php_only mode? */
+ if (ht->nNumOfElements != ht->nNextFreeElement
+ || ht->nNumOfElements != ret->nNumOfElements)
{
+ HashTable *properties = NULL;
+ HashPosition prop_pos;
+
+ ALLOC_HASHTABLE(var);
+ zend_hash_init(var, num, NULL, NULL, 0);
+
zend_hash_internal_pointer_reset_ex(ht, &pos);
for (;; zend_hash_move_forward_ex(ht, &pos))
{
@@ -222,61 +606,154 @@ int msgpack_convert_object(zval *return_value, zval *object, zval **value)
}
}
}
- }
- /* index */
- zend_hash_internal_pointer_reset_ex(ht, &pos);
- for (;; zend_hash_move_forward_ex(ht, &pos))
- {
- key_type = zend_hash_get_current_key_ex(
- ht, &key, &key_len, &key_index, 0, &pos);
+ /* index */
+ properties = Z_OBJ_HT_P(return_value)->get_properties(
+ return_value TSRMLS_CC);
- if (key_type == HASH_KEY_NON_EXISTANT)
+ if (HASH_OF(tpl))
{
- break;
+ properties = HASH_OF(tpl);
}
+ zend_hash_internal_pointer_reset_ex(properties, &prop_pos);
- if (zend_hash_get_current_data_ex(
- ht, (void *)&data, &pos) != SUCCESS)
+ zend_hash_internal_pointer_reset_ex(ht, &pos);
+ for (;; zend_hash_move_forward_ex(ht, &pos))
{
- continue;
- }
+ key_type = zend_hash_get_current_key_ex(
+ ht, &key, &key_len, &key_index, 0, &pos);
- switch (key_type)
- {
- case HASH_KEY_IS_LONG:
+ if (key_type == HASH_KEY_NON_EXISTANT)
{
- zval *val;
- MSGPACK_CONVERT_COPY_ZVAL(val, data);
- if (msgpack_convert_long_to_properties(
- ret, &properties, &prop_pos,
- key_index, val, var) != SUCCESS)
- {
- zval_ptr_dtor(&val);
- MSGPACK_WARNING(
- "[msgpack] (%s) "
- "illegal offset type, skip this decoding",
- __FUNCTION__);
- }
break;
}
- case HASH_KEY_IS_STRING:
+
+ if (zend_hash_get_current_data_ex(
+ ht, (void *)&data, &pos) != SUCCESS)
+ {
+ continue;
+ }
+
+ switch (key_type)
+ {
+ case HASH_KEY_IS_LONG:
+ {
+ zval *val;
+ MSGPACK_CONVERT_COPY_ZVAL(val, data);
+ if (msgpack_convert_long_to_properties(
+ ret, &properties, &prop_pos,
+ key_index, val, var) != SUCCESS)
+ {
+ zval_ptr_dtor(&val);
+ MSGPACK_WARNING(
+ "[msgpack] (%s) "
+ "illegal offset type, skip this decoding",
+ __FUNCTION__);
+ }
+ break;
+ }
+ case HASH_KEY_IS_STRING:
+ break;
+ default:
+ MSGPACK_WARNING(
+ "[msgpack] (%s) key is not string nor array",
+ __FUNCTION__);
+ break;
+ }
+ }
+
+ zend_hash_destroy(var);
+ FREE_HASHTABLE(var);
+ }
+ else
+ {
+ HashPosition valpos;
+ int (*convert_function)(zval *, zval *, zval **) = NULL;
+ zval **arydata, *aryval;
+
+ /* index */
+ zend_hash_internal_pointer_reset_ex(ret, &pos);
+ zend_hash_internal_pointer_reset_ex(ht, &valpos);
+ for (;; zend_hash_move_forward_ex(ret, &pos),
+ zend_hash_move_forward_ex(ht, &valpos))
+ {
+ key_type = zend_hash_get_current_key_ex(
+ ret, &key, &key_len, &key_index, 0, &pos);
+
+ if (key_type == HASH_KEY_NON_EXISTANT)
+ {
break;
- default:
+ }
+
+ if (zend_hash_get_current_data_ex(
+ ret, (void *)&data, &pos) != SUCCESS)
+ {
+ continue;
+ }
+
+ switch (Z_TYPE_PP(data))
+ {
+ case IS_ARRAY:
+ convert_function = msgpack_convert_array;
+ break;
+ case IS_OBJECT:
+ //case IS_STRING: -- may have default values of
+ // class members, so it's not wise to allow
+ convert_function = msgpack_convert_object;
+ break;
+ default:
+ break;
+ }
+
+ if (zend_hash_get_current_data_ex(
+ ht, (void *)&arydata, &valpos) != SUCCESS)
+ {
MSGPACK_WARNING(
- "[msgpack] (%s) key is not string nor array",
+ "[msgpack] (%s) can't get data value by index",
__FUNCTION__);
- break;
+ return FAILURE;
+ }
+
+ MSGPACK_CONVERT_COPY_ZVAL(aryval, arydata);
+
+ if (convert_function)
+ {
+ zval *rv;
+ ALLOC_INIT_ZVAL(rv);
+
+ if (convert_function(rv, *data, &aryval) != SUCCESS)
+ {
+ zval_ptr_dtor(&aryval);
+ MSGPACK_WARNING(
+ "[msgpack] (%s) "
+ "convert failure in convert_object",
+ __FUNCTION__);
+ return FAILURE;
+ }
+
+ zend_symtable_update(
+ ret, key, key_len, &rv, sizeof(rv), NULL);
+ }
+ else
+ {
+ zend_symtable_update(
+ ret, key, key_len, &aryval, sizeof(aryval), NULL);
+ }
}
}
- zend_hash_destroy(var);
- FREE_HASHTABLE(var);
-
zval_ptr_dtor(value);
break;
}
default:
+ {
+ HashTable *properties = NULL;
+ HashPosition prop_pos;
+
+ properties = Z_OBJ_HT_P(return_value)->get_properties(
+ return_value TSRMLS_CC);
+ zend_hash_internal_pointer_reset_ex(properties, &prop_pos);
+
if (msgpack_convert_long_to_properties(
HASH_OF(return_value), &properties, &prop_pos,
0, *value, NULL) != SUCCESS)
@@ -286,7 +763,32 @@ int msgpack_convert_object(zval *return_value, zval *object, zval **value)
__FUNCTION__);
}
break;
+ }
}
return SUCCESS;
}
+
+int msgpack_convert_template(zval *return_value, zval *tpl, zval **value)
+{
+ TSRMLS_FETCH();
+
+ switch (Z_TYPE_P(tpl))
+ {
+ case IS_ARRAY:
+ return msgpack_convert_array(return_value, tpl, value);
+ break;
+ case IS_STRING:
+ case IS_OBJECT:
+ return msgpack_convert_object(return_value, tpl, value);
+ break;
+ default:
+ MSGPACK_ERROR("[msgpack] (%s) Template type is unsupported",
+ __FUNCTION__);
+ return FAILURE;
+ }
+
+ // shouldn't reach
+ return FAILURE;
+}
+
diff --git a/php/msgpack_convert.h b/php/msgpack_convert.h
index 411f706b..93e045ee 100644
--- a/php/msgpack_convert.h
+++ b/php/msgpack_convert.h
@@ -3,5 +3,7 @@
#define MSGPACK_CONVERT_H
int msgpack_convert_object(zval *return_value, zval *object, zval **value);
+int msgpack_convert_array(zval *return_value, zval *tpl, zval **value);
+int msgpack_convert_template(zval *return_value, zval *tpl, zval **value);
#endif
diff --git a/php/package.xml b/php/package.xml
index 4bb29000..59c7606e 100644
--- a/php/package.xml
+++ b/php/package.xml
@@ -10,11 +10,11 @@
advect@gmail.com
yes
- 2011-01-16
-
+ 2011-07-27
+
- 0.4.0
- 0.4.0
+ 0.5.0
+ 0.5.0
beta
@@ -32,17 +32,17 @@
-
-
+
+
-
-
+
+
-
+
@@ -97,7 +97,7 @@
-
+
@@ -172,6 +172,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/php/php-msgpack.spec b/php/php-msgpack.spec
index c79dfc86..2c04f0b1 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.4.0
+Version: 0.5.0
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 87b28228..d677a1c7 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.4.0"
+#define MSGPACK_EXTENSION_VERSION "0.5.0"
#include "ext/standard/php_smart_str.h"
@@ -26,7 +26,7 @@ ZEND_BEGIN_MODULE_GLOBALS(msgpack)
zend_bool php_only;
ZEND_END_MODULE_GLOBALS(msgpack)
-ZEND_DECLARE_MODULE_GLOBALS(msgpack)
+ZEND_EXTERN_MODULE_GLOBALS(msgpack)
#ifdef ZTS
#define MSGPACK_G(v) TSRMG(msgpack_globals_id, zend_msgpack_globals *, v)
diff --git a/php/tests/034.phpt b/php/tests/034.phpt
index 6610c7c7..f14d934f 100644
--- a/php/tests/034.phpt
+++ b/php/tests/034.phpt
@@ -8,31 +8,34 @@ if(!extension_loaded('msgpack')) {
}
$datas = array(
- 87817,
- -1,
- array(1,2,3,"testing" => 10, "foo"),
- true,
- false,
- 0.187182,
- "dakjdh98389\000",
- null,
- (object)array(1,2,3),
+ 87817,
+ -1,
+ array(1,2,3,"testing" => 10, "foo"),
+ true,
+ false,
+ 0.187182,
+ "dakjdh98389\000",
+ null,
+ (object)array(1,2,3),
);
error_reporting(0);
-foreach ($datas as $data) {
- $str = msgpack_serialize($data);
- $len = strlen($str);
+foreach ($datas as $data)
+{
+ $str = msgpack_serialize($data);
+ $len = strlen($str);
- for ($j = 0; $j < 200; $j++) {
- for ($i = 0; $i < $len - 1; $i++) {
- $sub = substr($str, 0, $i);
- $sub .= mcrypt_create_iv(30, MCRYPT_DEV_URANDOM);
- $php_errormsg = null;
- $v = msgpack_unserialize($sub);
- }
- }
+ for ($j = 0; $j < 200; $j++)
+ {
+ for ($i = 0; $i < $len - 1; $i++)
+ {
+ $sub = substr($str, 0, $i);
+ $sub .= mcrypt_create_iv(30, MCRYPT_DEV_URANDOM);
+ $php_errormsg = null;
+ $v = msgpack_unserialize($sub);
+ }
+ }
}
--EXPECT--
diff --git a/php/tests/104.phpt b/php/tests/104.phpt
new file mode 100644
index 00000000..216baa33
--- /dev/null
+++ b/php/tests/104.phpt
@@ -0,0 +1,81 @@
+--TEST--
+unpack of template converter: class unpacker (array: string)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array("MyObj");
+
+test("object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/104b.phpt b/php/tests/104b.phpt
new file mode 100644
index 00000000..c46d9453
--- /dev/null
+++ b/php/tests/104b.phpt
@@ -0,0 +1,81 @@
+--TEST--
+unpack of template converter: class unpacker (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array("MyObj");
+
+test("object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/105.phpt b/php/tests/105.phpt
new file mode 100644
index 00000000..dcd2e08f
--- /dev/null
+++ b/php/tests/105.phpt
@@ -0,0 +1,81 @@
+--TEST--
+unpack of template converter: class unpacker (array: object)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array(new MyObj());
+
+test("object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/105b.phpt b/php/tests/105b.phpt
new file mode 100644
index 00000000..e7a96b13
--- /dev/null
+++ b/php/tests/105b.phpt
@@ -0,0 +1,81 @@
+--TEST--
+unpack of template converter: class unpacker (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array(new MyObj());
+
+test("object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/106.phpt b/php/tests/106.phpt
new file mode 100644
index 00000000..dc9a95be
--- /dev/null
+++ b/php/tests/106.phpt
@@ -0,0 +1,87 @@
+--TEST--
+unpack of template converter: class unpacker (string)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj {
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = "MyObj";
+
+test("recursive object /w string", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/106b.phpt b/php/tests/106b.phpt
new file mode 100644
index 00000000..2ebdcd15
--- /dev/null
+++ b/php/tests/106b.phpt
@@ -0,0 +1,88 @@
+--TEST--
+unpack of template converter: class unpacker (string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = "MyObj";
+
+test("recursive object /w string", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/107.phpt b/php/tests/107.phpt
new file mode 100644
index 00000000..14868324
--- /dev/null
+++ b/php/tests/107.phpt
@@ -0,0 +1,88 @@
+--TEST--
+unpack of template converter: class unpacker (object)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = new MyObj();
+
+test("recursive object /w instance", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/107b.phpt b/php/tests/107b.phpt
new file mode 100644
index 00000000..b8803a62
--- /dev/null
+++ b/php/tests/107b.phpt
@@ -0,0 +1,88 @@
+--TEST--
+unpack of template converter: class unpacker (object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = new MyObj();
+
+test("recursive object /w instance", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/108.phpt b/php/tests/108.phpt
new file mode 100644
index 00000000..bf21d880
--- /dev/null
+++ b/php/tests/108.phpt
@@ -0,0 +1,93 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: string)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/108b.phpt b/php/tests/108b.phpt
new file mode 100644
index 00000000..c1fb5e08
--- /dev/null
+++ b/php/tests/108b.phpt
@@ -0,0 +1,93 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/109.phpt b/php/tests/109.phpt
new file mode 100644
index 00000000..00c74216
--- /dev/null
+++ b/php/tests/109.phpt
@@ -0,0 +1,92 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: object)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj {
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array(new MyObj());
+
+test("recursive object with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/109b.phpt b/php/tests/109b.phpt
new file mode 100644
index 00000000..2b62a3cf
--- /dev/null
+++ b/php/tests/109b.phpt
@@ -0,0 +1,93 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/110.phpt b/php/tests/110.phpt
new file mode 100644
index 00000000..8c8131a8
--- /dev/null
+++ b/php/tests/110.phpt
@@ -0,0 +1,114 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: string)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/110b.phpt b/php/tests/110b.phpt
new file mode 100644
index 00000000..2924e767
--- /dev/null
+++ b/php/tests/110b.phpt
@@ -0,0 +1,114 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/111.phpt b/php/tests/111.phpt
new file mode 100644
index 00000000..aeb3f60f
--- /dev/null
+++ b/php/tests/111.phpt
@@ -0,0 +1,114 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: object)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/111b.phpt b/php/tests/111b.phpt
new file mode 100644
index 00000000..39e124fa
--- /dev/null
+++ b/php/tests/111b.phpt
@@ -0,0 +1,114 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/112.phpt b/php/tests/112.phpt
new file mode 100644
index 00000000..1cdaf45d
--- /dev/null
+++ b/php/tests/112.phpt
@@ -0,0 +1,144 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: string)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/112b.phpt b/php/tests/112b.phpt
new file mode 100644
index 00000000..af7c0cea
--- /dev/null
+++ b/php/tests/112b.phpt
@@ -0,0 +1,144 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/113.phpt b/php/tests/113.phpt
new file mode 100644
index 00000000..d4277354
--- /dev/null
+++ b/php/tests/113.phpt
@@ -0,0 +1,144 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: object)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/113b.phpt b/php/tests/113b.phpt
new file mode 100644
index 00000000..1b792b97
--- /dev/null
+++ b/php/tests/113b.phpt
@@ -0,0 +1,144 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/114.phpt b/php/tests/114.phpt
new file mode 100644
index 00000000..d325ec54
--- /dev/null
+++ b/php/tests/114.phpt
@@ -0,0 +1,166 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array)
+--SKIPIF--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$arySubObj = array(
+ "subdata" => "subdatadata",
+ "subpriv" => "subprivdata",
+ "subpdata" => null,
+);
+
+$aryMyObj = array(
+ "data" => "datadata",
+ "priv" => "privdata",
+ "pdata" => null,
+ "subary" => array($arySubObj),
+);
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array($aryMyObj);
+$resary = array($aryMyObj, $aryMyObj);
+$resary[0]["pdata"] = "pubdata0";
+$resary[0]["subary"][] = $arySubObj;
+$resary[0]["subary"][0]["subpdata"] = "subpubdata00";
+$resary[0]["subary"][1]["subpdata"] = "subpdata01";
+$resary[1]["subary"][] = $arySubObj;
+$resary[1]["pdata"] = "pubdata1";
+$resary[1]["subary"][0]["subpdata"] = "subpubdata1";
+$resary[1]["subary"][1]["subpdata"] = "subpdata11";
+
+test("recursive object list to associative array list", $ary, $tpl, $resary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/114b.phpt b/php/tests/114b.phpt
new file mode 100644
index 00000000..790fe964
--- /dev/null
+++ b/php/tests/114b.phpt
@@ -0,0 +1,166 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$arySubObj = array(
+ "subdata" => "subdatadata",
+ "subpriv" => "subprivdata",
+ "subpdata" => null,
+);
+
+$aryMyObj = array(
+ "data" => "datadata",
+ "priv" => "privdata",
+ "pdata" => null,
+ "subary" => array($arySubObj),
+);
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array($aryMyObj);
+$resary = array($aryMyObj, $aryMyObj);
+$resary[0]["pdata"] = "pubdata0";
+$resary[0]["subary"][] = $arySubObj;
+$resary[0]["subary"][0]["subpdata"] = "subpubdata00";
+$resary[0]["subary"][1]["subpdata"] = "subpdata01";
+$resary[1]["subary"][] = $arySubObj;
+$resary[1]["pdata"] = "pubdata1";
+$resary[1]["subary"][0]["subpdata"] = "subpubdata1";
+$resary[1]["subary"][1]["subpdata"] = "subpdata11";
+
+test("recursive object list to associative array list", $ary, $tpl, $resary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/115.phpt b/php/tests/115.phpt
new file mode 100644
index 00000000..67557719
--- /dev/null
+++ b/php/tests/115.phpt
@@ -0,0 +1,82 @@
+--TEST--
+unpack of template converter: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array("MyObj");
+
+test("object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/115b.phpt b/php/tests/115b.phpt
new file mode 100644
index 00000000..fd8569b3
--- /dev/null
+++ b/php/tests/115b.phpt
@@ -0,0 +1,89 @@
+--TEST--
+unpack of template converter: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array("MyObj");
+
+test("object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/116.phpt b/php/tests/116.phpt
new file mode 100644
index 00000000..b2404aa1
--- /dev/null
+++ b/php/tests/116.phpt
@@ -0,0 +1,82 @@
+--TEST--
+unpack of template converter: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array(new MyObj());
+
+test("object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/116b.phpt b/php/tests/116b.phpt
new file mode 100644
index 00000000..79c6e1eb
--- /dev/null
+++ b/php/tests/116b.phpt
@@ -0,0 +1,89 @@
+--TEST--
+unpack of template converter: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array(new MyObj());
+
+test("object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/117.phpt b/php/tests/117.phpt
new file mode 100644
index 00000000..15696099
--- /dev/null
+++ b/php/tests/117.phpt
@@ -0,0 +1,88 @@
+--TEST--
+unpack of template converter: class unpacker (string: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj {
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = "MyObj";
+
+test("recursive object /w string", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/117b.phpt b/php/tests/117b.phpt
new file mode 100644
index 00000000..910eebf4
--- /dev/null
+++ b/php/tests/117b.phpt
@@ -0,0 +1,96 @@
+--TEST--
+unpack of template converter: class unpacker (string: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = "MyObj";
+
+test("recursive object /w string", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/118.phpt b/php/tests/118.phpt
new file mode 100644
index 00000000..c73bde80
--- /dev/null
+++ b/php/tests/118.phpt
@@ -0,0 +1,89 @@
+--TEST--
+unpack of template converter: class unpacker (object: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = new MyObj();
+
+test("recursive object /w instance", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/118b.phpt b/php/tests/118b.phpt
new file mode 100644
index 00000000..2a93617e
--- /dev/null
+++ b/php/tests/118b.phpt
@@ -0,0 +1,96 @@
+--TEST--
+unpack of template converter: class unpacker (object: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = new MyObj();
+
+test("recursive object /w instance", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/119.phpt b/php/tests/119.phpt
new file mode 100644
index 00000000..ff4011a6
--- /dev/null
+++ b/php/tests/119.phpt
@@ -0,0 +1,94 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/119b.phpt b/php/tests/119b.phpt
new file mode 100644
index 00000000..bf3bc204
--- /dev/null
+++ b/php/tests/119b.phpt
@@ -0,0 +1,101 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/120.phpt b/php/tests/120.phpt
new file mode 100644
index 00000000..b9e196ec
--- /dev/null
+++ b/php/tests/120.phpt
@@ -0,0 +1,93 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj {
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array(new MyObj());
+
+test("recursive object with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/120b.phpt b/php/tests/120b.phpt
new file mode 100644
index 00000000..a2ceb91c
--- /dev/null
+++ b/php/tests/120b.phpt
@@ -0,0 +1,101 @@
+--TEST--
+unpack of template converter: multiple class: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/121.phpt b/php/tests/121.phpt
new file mode 100644
index 00000000..41fbce0b
--- /dev/null
+++ b/php/tests/121.phpt
@@ -0,0 +1,115 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/121b.phpt b/php/tests/121b.phpt
new file mode 100644
index 00000000..f9a957bc
--- /dev/null
+++ b/php/tests/121b.phpt
@@ -0,0 +1,122 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/122.phpt b/php/tests/122.phpt
new file mode 100644
index 00000000..ef9b103a
--- /dev/null
+++ b/php/tests/122.phpt
@@ -0,0 +1,115 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/122b.phpt b/php/tests/122b.phpt
new file mode 100644
index 00000000..21f29507
--- /dev/null
+++ b/php/tests/122b.phpt
@@ -0,0 +1,122 @@
+--TEST--
+unpack of template converter: multiple variable: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/123.phpt b/php/tests/123.phpt
new file mode 100644
index 00000000..477150d6
--- /dev/null
+++ b/php/tests/123.phpt
@@ -0,0 +1,145 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/123b.phpt b/php/tests/123b.phpt
new file mode 100644
index 00000000..799d3481
--- /dev/null
+++ b/php/tests/123b.phpt
@@ -0,0 +1,152 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: string: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/124.phpt b/php/tests/124.phpt
new file mode 100644
index 00000000..f45a2433
--- /dev/null
+++ b/php/tests/124.phpt
@@ -0,0 +1,145 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/124b.phpt b/php/tests/124b.phpt
new file mode 100644
index 00000000..a47eb19d
--- /dev/null
+++ b/php/tests/124b.phpt
@@ -0,0 +1,152 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: object: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/125.phpt b/php/tests/125.phpt
new file mode 100644
index 00000000..142cd40c
--- /dev/null
+++ b/php/tests/125.phpt
@@ -0,0 +1,167 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: OPT_PHPONLY=false)
+--SKIPIF--
+setOption(MessagePack::OPT_PHPONLY, false);
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$arySubObj = array(
+ "subdata" => "subdatadata",
+ "subpriv" => "subprivdata",
+ "subpdata" => null,
+);
+
+$aryMyObj = array(
+ "data" => "datadata",
+ "priv" => "privdata",
+ "pdata" => null,
+ "subary" => array($arySubObj),
+);
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array($aryMyObj);
+$resary = array($aryMyObj, $aryMyObj);
+$resary[0]["pdata"] = "pubdata0";
+$resary[0]["subary"][] = $arySubObj;
+$resary[0]["subary"][0]["subpdata"] = "subpubdata00";
+$resary[0]["subary"][1]["subpdata"] = "subpdata01";
+$resary[1]["subary"][] = $arySubObj;
+$resary[1]["pdata"] = "pubdata1";
+$resary[1]["subary"][0]["subpdata"] = "subpubdata1";
+$resary[1]["subary"][1]["subpdata"] = "subpdata11";
+
+test("recursive object list to associative array list", $ary, $tpl, $resary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/125b.phpt b/php/tests/125b.phpt
new file mode 100644
index 00000000..31e43a89
--- /dev/null
+++ b/php/tests/125b.phpt
@@ -0,0 +1,174 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array: OPT_PHPONLY=false)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+setOption(MESSAGEPACK_OPT_PHPONLY, false);
+ }
+ else
+ {
+ $msgpack->setOption(MessagePack::OPT_PHPONLY, false);
+ }
+
+ $serialized = $msgpack->pack($variable);
+
+ $unserialized = $msgpack->unpack($serialized, $object);
+
+ var_dump($unserialized);
+ if ($result)
+ {
+ echo $unserialized == $result ? 'OK' : 'ERROR', PHP_EOL;
+ }
+ else
+ {
+ echo 'SKIP', PHP_EOL;
+ }
+}
+
+class MyObj
+{
+ private $data = null;
+ private $priv = "privdata";
+ public $pdata = null;
+ public $subary = null;
+
+ function __construct()
+ {
+ $this->data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$arySubObj = array(
+ "subdata" => "subdatadata",
+ "subpriv" => "subprivdata",
+ "subpdata" => null,
+);
+
+$aryMyObj = array(
+ "data" => "datadata",
+ "priv" => "privdata",
+ "pdata" => null,
+ "subary" => array($arySubObj),
+);
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array($aryMyObj);
+$resary = array($aryMyObj, $aryMyObj);
+$resary[0]["pdata"] = "pubdata0";
+$resary[0]["subary"][] = $arySubObj;
+$resary[0]["subary"][0]["subpdata"] = "subpubdata00";
+$resary[0]["subary"][1]["subpdata"] = "subpdata01";
+$resary[1]["subary"][] = $arySubObj;
+$resary[1]["pdata"] = "pubdata1";
+$resary[1]["subary"][0]["subpdata"] = "subpubdata1";
+$resary[1]["subary"][1]["subpdata"] = "subpdata11";
+
+test("recursive object list to associative array list", $ary, $tpl, $resary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/126.phpt b/php/tests/126.phpt
new file mode 100644
index 00000000..351c4f1a
--- /dev/null
+++ b/php/tests/126.phpt
@@ -0,0 +1,78 @@
+--TEST--
+unpack of template converter (array: string)
+--SKIPIF--
+data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array("MyObj");
+
+test("object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/126b.phpt b/php/tests/126b.phpt
new file mode 100644
index 00000000..5bc6dd06
--- /dev/null
+++ b/php/tests/126b.phpt
@@ -0,0 +1,78 @@
+--TEST--
+unpack of template converter (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array("MyObj");
+
+test("object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/127.phpt b/php/tests/127.phpt
new file mode 100644
index 00000000..70c435b5
--- /dev/null
+++ b/php/tests/127.phpt
@@ -0,0 +1,78 @@
+--TEST--
+unpack of template converter (array: object)
+--SKIPIF--
+data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array(new MyObj());
+
+test("object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/127b.phpt b/php/tests/127b.phpt
new file mode 100644
index 00000000..fac7585a
--- /dev/null
+++ b/php/tests/127b.phpt
@@ -0,0 +1,78 @@
+--TEST--
+unpack of template converter (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata0";
+
+$obj2 = new MyObj();
+$obj2->pdata = "pubdata1";
+
+$ary = array($obj, $obj2);
+
+$tpl = array(new MyObj());
+
+test("object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ }
+ [1]=>
+ object(MyObj)#%d (3) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ }
+}
+OK
diff --git a/php/tests/128.phpt b/php/tests/128.phpt
new file mode 100644
index 00000000..40d7e7cc
--- /dev/null
+++ b/php/tests/128.phpt
@@ -0,0 +1,84 @@
+--TEST--
+unpack of template converter (string)
+--SKIPIF--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj {
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = "MyObj";
+
+test("recursive object /w string", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/128b.phpt b/php/tests/128b.phpt
new file mode 100644
index 00000000..fbdabf39
--- /dev/null
+++ b/php/tests/128b.phpt
@@ -0,0 +1,85 @@
+--TEST--
+unpack of template converter (string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = "MyObj";
+
+test("recursive object /w string", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/129.phpt b/php/tests/129.phpt
new file mode 100644
index 00000000..897e766b
--- /dev/null
+++ b/php/tests/129.phpt
@@ -0,0 +1,85 @@
+--TEST--
+unpack of template converter (object)
+--SKIPIF--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = new MyObj();
+
+test("recursive object /w instance", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/129b.phpt b/php/tests/129b.phpt
new file mode 100644
index 00000000..fa69ecf6
--- /dev/null
+++ b/php/tests/129b.phpt
@@ -0,0 +1,85 @@
+--TEST--
+unpack of template converter (object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$tpl = new MyObj();
+
+test("recursive object /w instance", $obj, $tpl, $obj);
+
+--EXPECTF--
+object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+}
+OK
diff --git a/php/tests/130.phpt b/php/tests/130.phpt
new file mode 100644
index 00000000..36779e7e
--- /dev/null
+++ b/php/tests/130.phpt
@@ -0,0 +1,90 @@
+--TEST--
+unpack of template converter: multiple class: (array: string)
+--SKIPIF--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/130b.phpt b/php/tests/130b.phpt
new file mode 100644
index 00000000..dd96cbd3
--- /dev/null
+++ b/php/tests/130b.phpt
@@ -0,0 +1,90 @@
+--TEST--
+unpack of template converter: multiple class: (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/131.phpt b/php/tests/131.phpt
new file mode 100644
index 00000000..d0f46346
--- /dev/null
+++ b/php/tests/131.phpt
@@ -0,0 +1,89 @@
+--TEST--
+unpack of template converter: multiple class: (array: object)
+--SKIPIF--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj {
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array(new MyObj());
+
+test("recursive object with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/131b.phpt b/php/tests/131b.phpt
new file mode 100644
index 00000000..e65350bf
--- /dev/null
+++ b/php/tests/131b.phpt
@@ -0,0 +1,90 @@
+--TEST--
+unpack of template converter: multiple class: (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj = new MyObj();
+$obj->pdata = "pubdata";
+$obj->subary->subpdata = "subpubdata";
+
+$ary = array($obj);
+
+$tpl = array("MyObj");
+
+test("recursive object with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(1) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(7) "pubdata"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpubdata"
+ }
+ }
+}
+OK
diff --git a/php/tests/132.phpt b/php/tests/132.phpt
new file mode 100644
index 00000000..fc38a82f
--- /dev/null
+++ b/php/tests/132.phpt
@@ -0,0 +1,111 @@
+--TEST--
+unpack of template converter: multiple variable: (array: string)
+--SKIPIF--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/132b.phpt b/php/tests/132b.phpt
new file mode 100644
index 00000000..7ddb9e72
--- /dev/null
+++ b/php/tests/132b.phpt
@@ -0,0 +1,111 @@
+--TEST--
+unpack of template converter: multiple variable: (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/133.phpt b/php/tests/133.phpt
new file mode 100644
index 00000000..7452a318
--- /dev/null
+++ b/php/tests/133.phpt
@@ -0,0 +1,111 @@
+--TEST--
+unpack of template converter: multiple variable: (array: object)
+--SKIPIF--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/133b.phpt b/php/tests/133b.phpt
new file mode 100644
index 00000000..aa41971a
--- /dev/null
+++ b/php/tests/133b.phpt
@@ -0,0 +1,111 @@
+--TEST--
+unpack of template converter: multiple variable: (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = new SubObj();
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary->subpdata = "subpubdata0";
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary->subpdata = "subpubdata1";
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata0"
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ }
+}
+OK
diff --git a/php/tests/134.phpt b/php/tests/134.phpt
new file mode 100644
index 00000000..587e1486
--- /dev/null
+++ b/php/tests/134.phpt
@@ -0,0 +1,141 @@
+--TEST--
+unpack of template converter: multiple class/variable: (array: string)
+--SKIPIF--
+data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/134b.phpt b/php/tests/134b.phpt
new file mode 100644
index 00000000..d243496f
--- /dev/null
+++ b/php/tests/134b.phpt
@@ -0,0 +1,141 @@
+--TEST--
+unpack of template converter: multiple class/variable: (array: string)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array("MyObj");
+
+test("recursive object list with object list /w string", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/135.phpt b/php/tests/135.phpt
new file mode 100644
index 00000000..3d36482f
--- /dev/null
+++ b/php/tests/135.phpt
@@ -0,0 +1,141 @@
+--TEST--
+unpack of template converter: multiple class/variable: (array: object)
+--SKIPIF--
+data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ [%r"?data"?:("MyObj":)?private"?%r]=>
+ string(8) "datadata"
+ [%r"?priv"?:("MyObj":)?private"?%r]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ [%r"?subdata"?:("SubObj":)?private"?%r]=>
+ string(11) "subdatadata"
+ [%r"?subpriv"?:("SubObj":)?private"?%r]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/135b.phpt b/php/tests/135b.phpt
new file mode 100644
index 00000000..4dd42765
--- /dev/null
+++ b/php/tests/135b.phpt
@@ -0,0 +1,141 @@
+--TEST--
+unpack of template converter: multiple class/variable: (array: object)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array(new MyObj());
+
+test("recursive object list with object list /w instance", $ary, $tpl, $ary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ object(MyObj)#%d (4) {
+ ["data:private"]=>
+ string(8) "datadata"
+ ["priv:private"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ object(SubObj)#%d (3) {
+ ["subdata:private"]=>
+ string(11) "subdatadata"
+ ["subpriv:private"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/136.phpt b/php/tests/136.phpt
new file mode 100644
index 00000000..2f2ef5d7
--- /dev/null
+++ b/php/tests/136.phpt
@@ -0,0 +1,163 @@
+--TEST--
+unpack of template converter: multiple class/variable: (array)
+--SKIPIF--
+data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$arySubObj = array(
+ "subdata" => "subdatadata",
+ "subpriv" => "subprivdata",
+ "subpdata" => null,
+);
+
+$aryMyObj = array(
+ "data" => "datadata",
+ "priv" => "privdata",
+ "pdata" => null,
+ "subary" => array($arySubObj),
+);
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array($aryMyObj);
+$resary = array($aryMyObj, $aryMyObj);
+$resary[0]["pdata"] = "pubdata0";
+$resary[0]["subary"][] = $arySubObj;
+$resary[0]["subary"][0]["subpdata"] = "subpubdata00";
+$resary[0]["subary"][1]["subpdata"] = "subpdata01";
+$resary[1]["subary"][] = $arySubObj;
+$resary[1]["pdata"] = "pubdata1";
+$resary[1]["subary"][0]["subpdata"] = "subpubdata1";
+$resary[1]["subary"][1]["subpdata"] = "subpdata11";
+
+test("recursive object list to associative array list", $ary, $tpl, $resary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK
diff --git a/php/tests/136b.phpt b/php/tests/136b.phpt
new file mode 100644
index 00000000..3b1d5b20
--- /dev/null
+++ b/php/tests/136b.phpt
@@ -0,0 +1,163 @@
+--TEST--
+unpack of template converter: multiple class/variable: class unpacker (array)
+--SKIPIF--
+= 0) {
+ echo "skip tests in PHP 5.1 or older";
+}
+--FILE--
+data = "datadata";
+ $this->subary = array(new SubObj());
+ }
+}
+
+class SubObj
+{
+ private $subdata = null;
+ private $subpriv = "subprivdata";
+ public $subpdata = null;
+
+ function __construct()
+ {
+ $this->subdata = "subdatadata";
+ }
+}
+
+$arySubObj = array(
+ "subdata" => "subdatadata",
+ "subpriv" => "subprivdata",
+ "subpdata" => null,
+);
+
+$aryMyObj = array(
+ "data" => "datadata",
+ "priv" => "privdata",
+ "pdata" => null,
+ "subary" => array($arySubObj),
+);
+
+$obj0 = new MyObj();
+$obj0->pdata = "pubdata0";
+$obj0->subary[0]->subpdata = "subpubdata00";
+$subobj01 = new SubObj();
+$subobj01->subpdata = "subpdata01";
+$obj0->subary[1] = $subobj01;
+$obj1 = new MyObj();
+$obj1->pdata = "pubdata1";
+$obj1->subary[0]->subpdata = "subpubdata1";
+$subobj11 = new SubObj();
+$subobj11->subpdata = "subpdata11";
+$obj1->subary[1] = $subobj11;
+
+$ary = array($obj0, $obj1);
+
+$tpl = array($aryMyObj);
+$resary = array($aryMyObj, $aryMyObj);
+$resary[0]["pdata"] = "pubdata0";
+$resary[0]["subary"][] = $arySubObj;
+$resary[0]["subary"][0]["subpdata"] = "subpubdata00";
+$resary[0]["subary"][1]["subpdata"] = "subpdata01";
+$resary[1]["subary"][] = $arySubObj;
+$resary[1]["pdata"] = "pubdata1";
+$resary[1]["subary"][0]["subpdata"] = "subpubdata1";
+$resary[1]["subary"][1]["subpdata"] = "subpdata11";
+
+test("recursive object list to associative array list", $ary, $tpl, $resary);
+
+--EXPECTF--
+array(2) {
+ [0]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata0"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(12) "subpubdata00"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata01"
+ }
+ }
+ }
+ [1]=>
+ array(4) {
+ ["data"]=>
+ string(8) "datadata"
+ ["priv"]=>
+ string(8) "privdata"
+ ["pdata"]=>
+ string(8) "pubdata1"
+ ["subary"]=>
+ array(2) {
+ [0]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(11) "subpubdata1"
+ }
+ [1]=>
+ array(3) {
+ ["subdata"]=>
+ string(11) "subdatadata"
+ ["subpriv"]=>
+ string(11) "subprivdata"
+ ["subpdata"]=>
+ string(10) "subpdata11"
+ }
+ }
+ }
+}
+OK