6b0213f8ac5ed744ce58c4a685d419bcb5fd5149
2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2013, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
18 #include <Zend/zend_closures.h>
20 #include "php_pq_callback.h"
22 void php_pq_callback_dtor(php_pq_callback_t
*cb
)
25 php_pq_callback_dtor(cb
->recursion
);
29 if (cb
->fci
.size
> 0) {
30 zend_fcall_info_args_clear(&cb
->fci
, 1);
31 zval_ptr_dtor(&cb
->fci
.function_name
);
33 zend_objects_store_del(cb
->fci
.object
);
39 void php_pq_callback_addref(php_pq_callback_t
*cb
)
41 Z_TRY_ADDREF(cb
->fci
.function_name
);
43 ++GC_REFCOUNT(cb
->fci
.object
);
47 zval
*php_pq_callback_to_zval(php_pq_callback_t
*cb
, zval
*tmp
)
49 php_pq_callback_addref(cb
);
54 array_init_size(tmp
, 2);
55 ZVAL_OBJ(&zo
, cb
->fci
.object
);
56 add_next_index_zval(tmp
, &zo
);
57 add_next_index_zval(tmp
, &cb
->fci
.function_name
);
62 return &cb
->fci
.function_name
;
65 zend_bool
php_pq_callback_is_locked(php_pq_callback_t
*cb
)
67 /* TODO: fixed in php7?
68 if (cb->fci.size > 0 && Z_TYPE_P(cb->fci.function_name) == IS_OBJECT) {
69 const zend_function *closure = zend_get_closure_method_def(cb->fci.function_name);
71 if (closure->type == ZEND_USER_FUNCTION) {
72 zend_execute_data *ex = EG(current_execute_data);
75 if (ex->op_array == &closure->op_array) {
78 ex = ex->prev_execute_data;
86 void php_pq_callback_recurse(php_pq_callback_t
*old
, php_pq_callback_t
*new TSRMLS_DC
)
88 if (new && new->fci
.size
> 0 && php_pq_callback_is_locked(old TSRMLS_CC
)) {
89 new->recursion
= emalloc(sizeof(*old
));
90 memcpy(new->recursion
, old
, sizeof(*old
));
91 } else if (new && new->fci
.size
> 0) {
92 php_pq_callback_dtor(old
);
93 php_pq_callback_addref(new);
94 memcpy(old
, new, sizeof(*old
));
97 php_pq_callback_dtor(old
);
106 * vim600: noet sw=4 ts=4 fdm=marker
107 * vim<600: noet sw=4 ts=4