diff options
Diffstat (limited to 'php/msgpack_class.c')
| -rw-r--r-- | php/msgpack_class.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/php/msgpack_class.c b/php/msgpack_class.c index 5cfff8d..ce008d9 100644 --- a/php/msgpack_class.c +++ b/php/msgpack_class.c @@ -19,6 +19,7 @@ typedef struct { msgpack_unpack_t mp; php_unserialize_data_t var_hash; long php_only; + zend_bool finished; } php_msgpack_unpacker_t; #if ZEND_MODULE_API_NO >= 20060613 @@ -348,6 +349,7 @@ static ZEND_METHOD(msgpack_unpacker, __construct) unpacker->buffer.a = 0; unpacker->retval = NULL; unpacker->offset = 0; + unpacker->finished = 0; template_init(&unpacker->mp); @@ -460,6 +462,22 @@ static ZEND_METHOD(msgpack_unpacker, execute) { ALLOC_INIT_ZVAL(unpacker->retval); } + else if (unpacker->finished) + { + zval_ptr_dtor(&unpacker->retval); + + msgpack_unserialize_var_destroy(&unpacker->var_hash); + + + ALLOC_INIT_ZVAL(unpacker->retval); + + template_init(&unpacker->mp); + + msgpack_unserialize_var_init(&unpacker->var_hash); + + (&unpacker->mp)->user.var_hash = + (php_unserialize_data_t *)&unpacker->var_hash; + } (&unpacker->mp)->user.retval = (zval *)unpacker->retval; MSGPACK_G(error_display) = 0; @@ -483,6 +501,7 @@ static ZEND_METHOD(msgpack_unpacker, execute) { case MSGPACK_UNPACK_EXTRA_BYTES: case MSGPACK_UNPACK_SUCCESS: + unpacker->finished = 1; RETURN_TRUE; default: RETURN_FALSE; @@ -493,7 +512,16 @@ static ZEND_METHOD(msgpack_unpacker, data) { MSGPACK_UNPACKER_OBJECT; - RETURN_ZVAL(unpacker->retval, 1, 1); + if (unpacker->retval != NULL) + { + ZVAL_ZVAL(return_value, unpacker->retval, 1, 0); + + MSGPACK_METHOD(msgpack_unpacker, reset, NULL, getThis()); + + return; + } + + RETURN_FALSE; } static ZEND_METHOD(msgpack_unpacker, reset) @@ -513,6 +541,7 @@ static ZEND_METHOD(msgpack_unpacker, reset) unpacker->buffer.len = 0; unpacker->buffer.a = 0; unpacker->offset = 0; + unpacker->finished = 0; if (buffer.len > 0) { @@ -530,12 +559,12 @@ static ZEND_METHOD(msgpack_unpacker, reset) msgpack_unserialize_var_destroy(&unpacker->var_hash); + template_init(&unpacker->mp); + msgpack_unserialize_var_init(&unpacker->var_hash); (&unpacker->mp)->user.var_hash = (php_unserialize_data_t *)&unpacker->var_hash; - - msgpack_unserialize_init(&((&unpacker->mp)->user)); } void msgpack_init_class() |
