@@ -74,6 +74,10 @@ static void observer_begin(zend_execute_data *execute_data)
7474{
7575 assert_observer_opline (execute_data );
7676
77+ if (ZT_G (observer_set_vm_interrupt_on_begin )) {
78+ zend_atomic_bool_store_ex (& EG (vm_interrupt ), true);
79+ }
80+
7781 if (!ZT_G (observer_show_output )) {
7882 return ;
7983 }
@@ -142,6 +146,14 @@ static void observer_end(zend_execute_data *execute_data, zval *retval)
142146 }
143147}
144148
149+ static void (* zend_test_prev_interrupt_function )(zend_execute_data * execute_data );
150+ static void zend_test_interrupt_function (zend_execute_data * execute_data )
151+ {
152+ if (zend_test_prev_interrupt_function ) {
153+ zend_test_prev_interrupt_function (execute_data );
154+ }
155+ }
156+
145157static void observer_show_init (zend_function * fbc )
146158{
147159 if (fbc -> common .function_name ) {
@@ -381,6 +393,7 @@ PHP_INI_BEGIN()
381393 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 )
382394 STD_PHP_INI_BOOLEAN ("zend_test.observer.show_opcode" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_opcode , zend_zend_test_globals , zend_test_globals )
383395 STD_PHP_INI_ENTRY ("zend_test.observer.show_opcode_in_user_handler" , "" , PHP_INI_SYSTEM , OnUpdateString , observer_show_opcode_in_user_handler , zend_zend_test_globals , zend_test_globals )
396+ STD_PHP_INI_BOOLEAN ("zend_test.observer.set_vm_interrupt_on_begin" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_set_vm_interrupt_on_begin , zend_zend_test_globals , zend_test_globals )
384397 STD_PHP_INI_BOOLEAN ("zend_test.observer.fiber_init" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_fiber_init , zend_zend_test_globals , zend_test_globals )
385398 STD_PHP_INI_BOOLEAN ("zend_test.observer.fiber_switch" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_fiber_switch , zend_zend_test_globals , zend_test_globals )
386399 STD_PHP_INI_BOOLEAN ("zend_test.observer.fiber_destroy" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_fiber_destroy , zend_zend_test_globals , zend_test_globals )
@@ -418,10 +431,20 @@ void zend_test_observer_init(INIT_FUNC_ARGS)
418431 zend_test_prev_execute_internal = zend_execute_internal ;
419432 zend_execute_internal = zend_test_execute_internal ;
420433 }
434+
435+ if (ZT_G (observer_set_vm_interrupt_on_begin )) {
436+ zend_test_prev_interrupt_function = zend_interrupt_function ;
437+ zend_interrupt_function = zend_test_interrupt_function ;
438+ }
421439}
422440
423441void zend_test_observer_shutdown (SHUTDOWN_FUNC_ARGS )
424442{
443+ if (zend_interrupt_function == zend_test_interrupt_function ) {
444+ zend_interrupt_function = zend_test_prev_interrupt_function ;
445+ zend_test_prev_interrupt_function = NULL ;
446+ }
447+
425448 if (type != MODULE_TEMPORARY ) {
426449 UNREGISTER_INI_ENTRIES ();
427450 }
0 commit comments