X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pq_callback.c;h=2b58b40034494857ddac31e75d6e11693b15992c;hp=de01c37ac13b48c5481e77b7e97c152f175c0d39;hb=HEAD;hpb=a06db6d217fc8ba0fd9b8273a9e595477d59afcc diff --git a/src/php_pq_callback.c b/src/php_pq_callback.c index de01c37..2b58b40 100644 --- a/src/php_pq_callback.c +++ b/src/php_pq_callback.c @@ -29,8 +29,11 @@ void php_pq_callback_dtor(php_pq_callback_t *cb) if (cb->fci.size > 0) { zend_fcall_info_args_clear(&cb->fci, 1); zval_ptr_dtor(&cb->fci.function_name); - if (cb->fci.object_ptr) { - zval_ptr_dtor(&cb->fci.object_ptr); + if (cb->fci.object) { + zval tmp; + + ZVAL_OBJ(&tmp, cb->fci.object); + zval_ptr_dtor(&tmp); } cb->fci.size = 0; } @@ -38,32 +41,53 @@ void php_pq_callback_dtor(php_pq_callback_t *cb) void php_pq_callback_addref(php_pq_callback_t *cb) { - Z_ADDREF_P(cb->fci.function_name); - if (cb->fci.object_ptr) { - Z_ADDREF_P(cb->fci.object_ptr); + Z_TRY_ADDREF(cb->fci.function_name); + if (cb->fci.object) { +#ifdef GC_ADDREF + GC_ADDREF(cb->fci.object); +#else + ++GC_REFCOUNT(cb->fci.object); +#endif } } -zval *php_pq_callback_to_zval(php_pq_callback_t *cb) +zval *php_pq_callback_to_zval(php_pq_callback_t *cb, zval *tmp) { - zval *zcb; - php_pq_callback_addref(cb); - if (cb->fci.object_ptr) { - MAKE_STD_ZVAL(zcb); - array_init_size(zcb, 2); - add_next_index_zval(zcb, cb->fci.object_ptr); - add_next_index_zval(zcb, cb->fci.function_name); - } else { - zcb = cb->fci.function_name; + if (cb->fci.object) { + zval zo; + + array_init_size(tmp, 2); + ZVAL_OBJ(&zo, cb->fci.object); + add_next_index_zval(tmp, &zo); + add_next_index_zval(tmp, &cb->fci.function_name); + + return tmp; + } + + return &cb->fci.function_name; +} + +zval *php_pq_callback_to_zval_no_addref(php_pq_callback_t *cb, zval *tmp) +{ + if (cb->fci.object) { + zval zo; + + array_init_size(tmp, 2); + ZVAL_OBJ(&zo, cb->fci.object); + add_next_index_zval(tmp, &zo); + add_next_index_zval(tmp, &cb->fci.function_name); + + return tmp; } - return zcb; + return &cb->fci.function_name; } -zend_bool php_pq_callback_is_locked(php_pq_callback_t *cb TSRMLS_DC) +zend_bool php_pq_callback_is_locked(php_pq_callback_t *cb) { + /* TODO: fixed in php7? if (php_pq_callback_is_enabled(cb)) { const zend_function *closure; const zend_execute_data *ex; @@ -72,7 +96,7 @@ zend_bool php_pq_callback_is_locked(php_pq_callback_t *cb TSRMLS_DC) return 0; } - closure = zend_get_closure_method_def(cb->fci.function_name TSRMLS_CC); + closure = zend_get_closure_method_def(cb->fci.function_name); if (closure->type != ZEND_USER_FUNCTION) { return 0; } @@ -83,17 +107,18 @@ zend_bool php_pq_callback_is_locked(php_pq_callback_t *cb TSRMLS_DC) } } } - if (!php_pq_callback_is_recurrent(cb)) { return 0; } - return php_pq_callback_is_locked(cb->recursion TSRMLS_CC); + return php_pq_callback_is_locked(cb->recursion); + */ + return 0; } -void php_pq_callback_recurse(php_pq_callback_t *old, php_pq_callback_t *new TSRMLS_DC) +void php_pq_callback_recurse(php_pq_callback_t *old, php_pq_callback_t *new) { - if (php_pq_callback_is_locked(old TSRMLS_CC)) { - php_pq_callback_recurse_ex(old, new TSRMLS_CC); + if (php_pq_callback_is_locked(old)) { + php_pq_callback_recurse_ex(old, new); } else { php_pq_callback_dtor(old); if (php_pq_callback_is_enabled(new)) { @@ -114,14 +139,14 @@ extern zend_bool php_pq_callback_is_recurrent(php_pq_callback_t *cb) return cb && cb->recursion != NULL; } -extern void php_pq_callback_disable(php_pq_callback_t *cb TSRMLS_DC) +extern void php_pq_callback_disable(php_pq_callback_t *cb) { if (php_pq_callback_is_enabled(cb)) { - php_pq_callback_recurse_ex(cb, NULL TSRMLS_CC); + php_pq_callback_recurse_ex(cb, NULL); } } -extern void php_pq_callback_recurse_ex(php_pq_callback_t *old, php_pq_callback_t *new TSRMLS_DC) +extern void php_pq_callback_recurse_ex(php_pq_callback_t *old, php_pq_callback_t *new) { php_pq_callback_t *tmp = emalloc(sizeof(*tmp)); @@ -131,7 +156,7 @@ extern void php_pq_callback_recurse_ex(php_pq_callback_t *old, php_pq_callback_t old->recursion = tmp; php_pq_callback_addref(old); - php_pq_callback_disable(tmp TSRMLS_CC); + php_pq_callback_disable(tmp); } else { memcpy(tmp, old, sizeof(*tmp)); memset(old, 0, sizeof(*old));