@@ -129,6 +129,46 @@ static void observer_end(zend_execute_data *execute_data, zval *retval)
129
129
if (EG (exception )) {
130
130
php_printf ("%*s<!-- Exception: %s -->\n" , 2 * ZT_G (observer_nesting_depth ), "" , ZSTR_VAL (EG (exception )-> ce -> name ));
131
131
}
132
+
133
+ if (ZT_G (observer_observe_end_call_function_name ) && strlen (ZT_G (observer_observe_end_call_function_name )) > 0 ) {
134
+ zend_fcall_info fci = empty_fcall_info ;
135
+ zend_fcall_info_cache fcc = empty_fcall_info_cache ;
136
+
137
+ zval function_name = {.u1 .type_info = IS_UNDEF };
138
+
139
+ // Initialize the zval with the zend_string value
140
+ ZVAL_STRING (& function_name , ZT_G (observer_observe_end_call_function_name ));
141
+
142
+ char * error = 0 ;
143
+ if (zend_fcall_info_init (& function_name , 0 , & fci , & fcc , NULL , & error ) != SUCCESS ) {
144
+
145
+ php_printf ("<!-- Hook (%s) not found: %s-->\n" , Z_STRVAL (function_name ), error );
146
+ efree (error );
147
+ } else {
148
+
149
+ zval ret = {.u1 .type_info = IS_UNDEF };
150
+ fci .param_count = 0 ;
151
+ fci .params = NULL ;
152
+ fci .named_params = NULL ;
153
+ fci .retval = & ret ;
154
+
155
+ if (zend_call_function (& fci , & fcc ) == SUCCESS ) {
156
+ if (!Z_ISUNDEF (ret ) &&
157
+ (fcc .function_handler -> op_array .fn_flags &
158
+ ZEND_ACC_HAS_RETURN_TYPE ) &&
159
+ !(ZEND_TYPE_PURE_MASK (
160
+ fcc .function_handler -> common .arg_info [-1 ].type ) &
161
+ MAY_BE_VOID )) {
162
+ if (execute_data -> return_value ) {
163
+ zval_ptr_dtor (execute_data -> return_value );
164
+ ZVAL_COPY (execute_data -> return_value , & ret );
165
+ ZVAL_UNDEF (& ret );
166
+ }
167
+ }
168
+ }
169
+ }
170
+ zval_ptr_dtor (& function_name );
171
+ }
132
172
observer_show_opcode (execute_data );
133
173
ZT_G (observer_nesting_depth )-- ;
134
174
if (execute_data -> func && execute_data -> func -> common .function_name ) {
@@ -346,6 +386,7 @@ PHP_INI_BEGIN()
346
386
STD_PHP_INI_BOOLEAN ("zend_test.observer.observe_functions" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_observe_functions , zend_zend_test_globals , zend_test_globals )
347
387
STD_PHP_INI_BOOLEAN ("zend_test.observer.observe_declaring" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_observe_declaring , zend_zend_test_globals , zend_test_globals )
348
388
STD_PHP_INI_ENTRY ("zend_test.observer.observe_function_names" , "" , PHP_INI_ALL , zend_test_observer_OnUpdateCommaList , observer_observe_function_names , zend_zend_test_globals , zend_test_globals )
389
+ 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 )
349
390
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 )
350
391
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 )
351
392
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