@@ -119,6 +119,46 @@ static void observer_end(zend_execute_data *execute_data, zval *retval)
119
119
if (EG (exception )) {
120
120
php_printf ("%*s<!-- Exception: %s -->\n" , 2 * ZT_G (observer_nesting_depth ), "" , ZSTR_VAL (EG (exception )-> ce -> name ));
121
121
}
122
+
123
+ if (ZT_G (observer_observe_end_call_function_name ) && strlen (ZT_G (observer_observe_end_call_function_name )) > 0 ) {
124
+ zend_fcall_info fci = empty_fcall_info ;
125
+ zend_fcall_info_cache fcc = empty_fcall_info_cache ;
126
+
127
+ zval function_name = {.u1 .type_info = IS_UNDEF };
128
+
129
+ // Initialize the zval with the zend_string value
130
+ ZVAL_STRING (& function_name , ZT_G (observer_observe_end_call_function_name ));
131
+
132
+ char * error = 0 ;
133
+ if (zend_fcall_info_init (& function_name , 0 , & fci , & fcc , NULL , & error ) != SUCCESS ) {
134
+
135
+ php_printf ("<!-- Hook (%s) not found: %s-->\n" , Z_STRVAL (function_name ), error );
136
+ efree (error );
137
+ } else {
138
+
139
+ zval ret = {.u1 .type_info = IS_UNDEF };
140
+ fci .param_count = 0 ;
141
+ fci .params = NULL ;
142
+ fci .named_params = NULL ;
143
+ fci .retval = & ret ;
144
+
145
+ if (zend_call_function (& fci , & fcc ) == SUCCESS ) {
146
+ if (!Z_ISUNDEF (ret ) &&
147
+ (fcc .function_handler -> op_array .fn_flags &
148
+ ZEND_ACC_HAS_RETURN_TYPE ) &&
149
+ !(ZEND_TYPE_PURE_MASK (
150
+ fcc .function_handler -> common .arg_info [-1 ].type ) &
151
+ MAY_BE_VOID )) {
152
+ if (execute_data -> return_value ) {
153
+ zval_ptr_dtor (execute_data -> return_value );
154
+ ZVAL_COPY (execute_data -> return_value , & ret );
155
+ ZVAL_UNDEF (& ret );
156
+ }
157
+ }
158
+ }
159
+ }
160
+ zval_ptr_dtor (& function_name );
161
+ }
122
162
observer_show_opcode (execute_data );
123
163
ZT_G (observer_nesting_depth )-- ;
124
164
if (execute_data -> func && execute_data -> func -> common .function_name ) {
@@ -304,6 +344,7 @@ PHP_INI_BEGIN()
304
344
STD_PHP_INI_BOOLEAN ("zend_test.observer.observe_includes" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_observe_includes , zend_zend_test_globals , zend_test_globals )
305
345
STD_PHP_INI_BOOLEAN ("zend_test.observer.observe_functions" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_observe_functions , zend_zend_test_globals , zend_test_globals )
306
346
STD_PHP_INI_ENTRY ("zend_test.observer.observe_function_names" , "" , PHP_INI_SYSTEM , zend_test_observer_OnUpdateCommaList , observer_observe_function_names , zend_zend_test_globals , zend_test_globals )
347
+ STD_PHP_INI_ENTRY ("zend_test.observer.observe_end_call_function_name" , "" , PHP_INI_ALL , OnUpdateString , observer_observe_end_call_function_name , zend_zend_test_globals , zend_test_globals )
307
348
STD_PHP_INI_BOOLEAN ("zend_test.observer.show_return_type" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_return_type , zend_zend_test_globals , zend_test_globals )
308
349
STD_PHP_INI_BOOLEAN ("zend_test.observer.show_return_value" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_return_value , zend_zend_test_globals , zend_test_globals )
309
350
STD_PHP_INI_BOOLEAN ("zend_test.observer.show_init_backtrace" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_init_backtrace , zend_zend_test_globals , zend_test_globals )
0 commit comments