@@ -78,6 +78,10 @@ static void observer_begin(zend_execute_data *execute_data)
7878{
7979 assert_observer_opline (execute_data );
8080
81+ if (ZT_G (observer_set_vm_interrupt_on_begin )) {
82+ zend_atomic_bool_store_ex (& EG (vm_interrupt ), true);
83+ }
84+
8185 if (!ZT_G (observer_show_output )) {
8286 return ;
8387 }
@@ -146,6 +150,14 @@ static void observer_end(zend_execute_data *execute_data, zval *retval)
146150 }
147151}
148152
153+ static void (* zend_test_prev_interrupt_function )(zend_execute_data * execute_data );
154+ static void zend_test_interrupt_function (zend_execute_data * execute_data )
155+ {
156+ if (zend_test_prev_interrupt_function ) {
157+ zend_test_prev_interrupt_function (execute_data );
158+ }
159+ }
160+
149161static void observer_show_init (zend_function * fbc )
150162{
151163 if (fbc -> common .function_name ) {
@@ -361,6 +373,7 @@ PHP_INI_BEGIN()
361373 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 )
362374 STD_PHP_INI_BOOLEAN ("zend_test.observer.show_opcode" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_opcode , zend_zend_test_globals , zend_test_globals )
363375 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 )
376+ 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 )
364377 STD_PHP_INI_BOOLEAN ("zend_test.observer.fiber_init" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_fiber_init , zend_zend_test_globals , zend_test_globals )
365378 STD_PHP_INI_BOOLEAN ("zend_test.observer.fiber_switch" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_fiber_switch , zend_zend_test_globals , zend_test_globals )
366379 STD_PHP_INI_BOOLEAN ("zend_test.observer.fiber_destroy" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_fiber_destroy , zend_zend_test_globals , zend_test_globals )
@@ -398,10 +411,20 @@ void zend_test_observer_init(INIT_FUNC_ARGS)
398411 zend_test_prev_execute_internal = zend_execute_internal ;
399412 zend_execute_internal = zend_test_execute_internal ;
400413 }
414+
415+ if (ZT_G (observer_set_vm_interrupt_on_begin )) {
416+ zend_test_prev_interrupt_function = zend_interrupt_function ;
417+ zend_interrupt_function = zend_test_interrupt_function ;
418+ }
401419}
402420
403421void zend_test_observer_shutdown (SHUTDOWN_FUNC_ARGS )
404422{
423+ if (zend_interrupt_function == zend_test_interrupt_function ) {
424+ zend_interrupt_function = zend_test_prev_interrupt_function ;
425+ zend_test_prev_interrupt_function = NULL ;
426+ }
427+
405428 if (type != MODULE_TEMPORARY ) {
406429 UNREGISTER_INI_ENTRIES ();
407430 }
0 commit comments