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
);
32 if (cb
->fci
.object_ptr
) {
33 zval_ptr_dtor(&cb
->fci
.object_ptr
);
39 void php_pq_callback_addref(php_pq_callback_t
*cb
)
41 Z_ADDREF_P(cb
->fci
.function_name
);
42 if (cb
->fci
.object_ptr
) {
43 Z_ADDREF_P(cb
->fci
.object_ptr
);
47 zval
*php_pq_callback_to_zval(php_pq_callback_t
*cb
)
51 php_pq_callback_addref(cb
);
53 if (cb
->fci
.object_ptr
) {
55 array_init_size(zcb
, 2);
56 add_next_index_zval(zcb
, cb
->fci
.object_ptr
);
57 add_next_index_zval(zcb
, cb
->fci
.function_name
);
59 zcb
= cb
->fci
.function_name
;
65 zend_bool
php_pq_callback_is_locked(php_pq_callback_t
*cb TSRMLS_DC
)
67 if (cb
->fci
.size
> 0 && Z_TYPE_P(cb
->fci
.function_name
) == IS_OBJECT
) {
68 const zend_function
*closure
= zend_get_closure_method_def(cb
->fci
.function_name TSRMLS_CC
);
70 if (closure
->type
== ZEND_USER_FUNCTION
) {
71 zend_execute_data
*ex
= EG(current_execute_data
);
74 if (ex
->op_array
== &closure
->op_array
) {
77 ex
= ex
->prev_execute_data
;
84 void php_pq_callback_recurse(php_pq_callback_t
*old
, php_pq_callback_t
*new TSRMLS_DC
)
86 if (new && new->fci
.size
> 0 && php_pq_callback_is_locked(old TSRMLS_CC
)) {
87 new->recursion
= emalloc(sizeof(*old
));
88 memcpy(new->recursion
, old
, sizeof(*old
));
89 } else if (new && new->fci
.size
> 0) {
90 php_pq_callback_dtor(old
);
91 php_pq_callback_addref(new);
92 memcpy(old
, new, sizeof(*old
));
95 php_pq_callback_dtor(old
);
104 * vim600: noet sw=4 ts=4 fdm=marker
105 * vim<600: noet sw=4 ts=4