- 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);
+ 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 &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;
+
+ if (Z_TYPE_P(cb->fci.function_name) != IS_OBJECT) {
+ return 0;
+ }
+
+ closure = zend_get_closure_method_def(cb->fci.function_name);
+ if (closure->type != ZEND_USER_FUNCTION) {
+ return 0;
+ }
+
+ for (ex = EG(current_execute_data); ex; ex = ex->prev_execute_data) {
+ if (ex->op_array == &closure->op_array) {
+ return 1;
+ }
+ }
+ }
+ if (!php_pq_callback_is_recurrent(cb)) {
+ return 0;
+ }
+ 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)
+{
+ if (php_pq_callback_is_locked(old)) {
+ php_pq_callback_recurse_ex(old, new);