Merge branch 'v1.0.x'
[m6w6/ext-pq] / src / php_pq_callback.c
index de01c37ac13b48c5481e77b7e97c152f175c0d39..17d7e70efeff025b9d2e6fb3cd2ed402ea3fbfd7 100644 (file)
@@ -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,49 @@ 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) {
+               ++GC_REFCOUNT(cb->fci.object);
        }
 }
 
-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 zcb;
+       return &cb->fci.function_name;
 }
 
-zend_bool php_pq_callback_is_locked(php_pq_callback_t *cb TSRMLS_DC)
+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 &cb->fci.function_name;
+}
+
+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 +92,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 +103,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 +135,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 +152,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));