diff options
| author | advect <advect@gmail.com> | 2010-10-30 16:06:50 +0900 |
|---|---|---|
| committer | advect <advect@gmail.com> | 2010-10-30 16:06:50 +0900 |
| commit | bad69fd3977fca94d643a88d819badaca4839fd5 (patch) | |
| tree | 87ca7d41a9d66fdef51e5b035d39ba44d62380c7 /php/msgpack_class.c | |
| parent | b4ae6bf82c8bcd6012c805a2206fcb81ad39dd0b (diff) | |
| download | msgpack-python-bad69fd3977fca94d643a88d819badaca4839fd5.tar.gz | |
php: fiexed unpacker
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() |
