mirror of
https://github.com/msgpack/msgpack-python.git
synced 2026-02-07 02:09:59 +00:00
php: added unpack of class object converter
This commit is contained in:
parent
fe26df5355
commit
5debbd2be8
86 changed files with 14795 additions and 1451 deletions
|
|
@ -6,6 +6,7 @@
|
|||
#include "php_msgpack.h"
|
||||
#include "msgpack_pack.h"
|
||||
#include "msgpack_unpack.h"
|
||||
#include "msgpack_errors.h"
|
||||
|
||||
#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 3)
|
||||
# define Z_ADDREF_PP(ppz) ZVAL_ADDREF(*(ppz))
|
||||
|
|
@ -228,12 +229,8 @@ inline static zend_class_entry* msgpack_unserialize_class(
|
|||
CG(function_table), NULL, user_func, &retval_ptr,
|
||||
1, args, 0, NULL TSRMLS_CC) != SUCCESS)
|
||||
{
|
||||
if (MSGPACK_G(error_display))
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) defined (%s) but not found",
|
||||
__FUNCTION__, class_name);
|
||||
}
|
||||
MSGPACK_WARNING("[msgpack] (%s) defined (%s) but not found",
|
||||
__FUNCTION__, class_name);
|
||||
|
||||
incomplete_class = 1;
|
||||
ce = PHP_IC_ENTRY;
|
||||
|
|
@ -253,13 +250,9 @@ inline static zend_class_entry* msgpack_unserialize_class(
|
|||
}
|
||||
else
|
||||
{
|
||||
if (MSGPACK_G(error_display))
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) "
|
||||
"Function %s() hasn't defined the class "
|
||||
"it was called for", __FUNCTION__, class_name);
|
||||
}
|
||||
MSGPACK_WARNING("[msgpack] (%s) Function %s() hasn't defined "
|
||||
"the class it was called for",
|
||||
__FUNCTION__, class_name);
|
||||
|
||||
incomplete_class = 1;
|
||||
ce = PHP_IC_ENTRY;
|
||||
|
|
@ -272,12 +265,7 @@ inline static zend_class_entry* msgpack_unserialize_class(
|
|||
|
||||
if (EG(exception))
|
||||
{
|
||||
if (MSGPACK_G(error_display))
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) Exception error", __FUNCTION__);
|
||||
}
|
||||
|
||||
MSGPACK_WARNING("[msgpack] (%s) Exception error", __FUNCTION__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -552,6 +540,12 @@ int msgpack_unserialize_map_item(
|
|||
case MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT:
|
||||
unpack->type = MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT;
|
||||
break;
|
||||
case MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE:
|
||||
unpack->type = MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE;
|
||||
break;
|
||||
case MSGPACK_SERIALIZE_TYPE_OBJECT:
|
||||
unpack->type = MSGPACK_SERIALIZE_TYPE_OBJECT;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -573,78 +567,88 @@ int msgpack_unserialize_map_item(
|
|||
|
||||
return 0;
|
||||
}
|
||||
else if (unpack->type == MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT)
|
||||
else
|
||||
{
|
||||
unpack->type = MSGPACK_SERIALIZE_TYPE_NONE;
|
||||
|
||||
ce = msgpack_unserialize_class(
|
||||
container, Z_STRVAL_P(key), Z_STRLEN_P(key));
|
||||
|
||||
if (ce == NULL)
|
||||
switch (unpack->type)
|
||||
{
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
case MSGPACK_SERIALIZE_TYPE_CUSTOM_OBJECT:
|
||||
unpack->type = MSGPACK_SERIALIZE_TYPE_NONE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
ce = msgpack_unserialize_class(
|
||||
container, Z_STRVAL_P(key), Z_STRLEN_P(key));
|
||||
if (ce == NULL)
|
||||
{
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0)
|
||||
/* implementing Serializable */
|
||||
if (ce->unserialize == NULL)
|
||||
{
|
||||
if (MSGPACK_G(error_display))
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) Class %s has no unserializer",
|
||||
__FUNCTION__, ce->name);
|
||||
}
|
||||
/* implementing Serializable */
|
||||
if (ce->unserialize == NULL)
|
||||
{
|
||||
MSGPACK_WARNING(
|
||||
"[msgpack] (%s) Class %s has no unserializer",
|
||||
__FUNCTION__, ce->name);
|
||||
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ce->unserialize(
|
||||
container, ce,
|
||||
(const unsigned char *)Z_STRVAL_P(val), Z_STRLEN_P(val) + 1,
|
||||
NULL TSRMLS_CC);
|
||||
ce->unserialize(
|
||||
container, ce,
|
||||
(const unsigned char *)Z_STRVAL_P(val),
|
||||
Z_STRLEN_P(val) + 1, NULL TSRMLS_CC);
|
||||
#endif
|
||||
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
else if (unpack->type == MSGPACK_SERIALIZE_TYPE_RECURSIVE)
|
||||
{
|
||||
zval **rval;
|
||||
|
||||
unpack->type = MSGPACK_SERIALIZE_TYPE_NONE;
|
||||
if (msgpack_var_access(
|
||||
unpack->var_hash, Z_LVAL_P(val) - 1, &rval) != SUCCESS)
|
||||
{
|
||||
if (MSGPACK_G(error_display))
|
||||
return 0;
|
||||
case MSGPACK_SERIALIZE_TYPE_RECURSIVE:
|
||||
case MSGPACK_SERIALIZE_TYPE_OBJECT:
|
||||
case MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE:
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) Invalid references value: %ld",
|
||||
__FUNCTION__, Z_LVAL_P(val) - 1);
|
||||
zval **rval;
|
||||
int type = unpack->type;
|
||||
|
||||
unpack->type = MSGPACK_SERIALIZE_TYPE_NONE;
|
||||
if (msgpack_var_access(
|
||||
unpack->var_hash,
|
||||
Z_LVAL_P(val) - 1, &rval) != SUCCESS)
|
||||
{
|
||||
MSGPACK_WARNING(
|
||||
"[msgpack] (%s) Invalid references value: %ld",
|
||||
__FUNCTION__, Z_LVAL_P(val) - 1);
|
||||
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (container != NULL)
|
||||
{
|
||||
zval_ptr_dtor(container);
|
||||
}
|
||||
|
||||
*container = *rval;
|
||||
|
||||
Z_ADDREF_PP(container);
|
||||
|
||||
if (type == MSGPACK_SERIALIZE_TYPE_OBJECT)
|
||||
{
|
||||
Z_UNSET_ISREF_PP(container);
|
||||
}
|
||||
else if (type == MSGPACK_SERIALIZE_TYPE_OBJECT_REFERENCE)
|
||||
{
|
||||
Z_SET_ISREF_PP(container);
|
||||
}
|
||||
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (container != NULL)
|
||||
{
|
||||
zval_ptr_dtor(container);
|
||||
}
|
||||
|
||||
*container = *rval;
|
||||
|
||||
Z_ADDREF_PP(container);
|
||||
|
||||
MSGPACK_UNSERIALIZE_FINISH_MAP_ITEM(unpack, key, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -661,13 +665,9 @@ int msgpack_unserialize_map_item(
|
|||
sizeof(val), NULL) == FAILURE)
|
||||
{
|
||||
zval_ptr_dtor(&val);
|
||||
if (MSGPACK_G(error_display))
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) "
|
||||
"illegal offset type, skip this decoding",
|
||||
__FUNCTION__);
|
||||
}
|
||||
MSGPACK_WARNING(
|
||||
"[msgpack] (%s) illegal offset type, skip this decoding",
|
||||
__FUNCTION__);
|
||||
}
|
||||
break;
|
||||
case IS_STRING:
|
||||
|
|
@ -676,24 +676,16 @@ int msgpack_unserialize_map_item(
|
|||
&val, sizeof(val), NULL) == FAILURE)
|
||||
{
|
||||
zval_ptr_dtor(&val);
|
||||
if (MSGPACK_G(error_display))
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) "
|
||||
"illegal offset type, skip this decoding",
|
||||
__FUNCTION__);
|
||||
}
|
||||
MSGPACK_WARNING(
|
||||
"[msgpack] (%s) illegal offset type, skip this decoding",
|
||||
__FUNCTION__);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
zval_ptr_dtor(&val);
|
||||
if (MSGPACK_G(error_display))
|
||||
{
|
||||
zend_error(E_WARNING,
|
||||
"[msgpack] (%s) "
|
||||
"illegal offset type, skip this decoding",
|
||||
__FUNCTION__);
|
||||
}
|
||||
MSGPACK_WARNING(
|
||||
"[msgpack] (%s) illegal offset type, skip this decoding",
|
||||
__FUNCTION__);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue