|
18 | 18 | #include "zend_smart_str.h" |
19 | 19 | #include "ext/standard/php_var.h" |
20 | 20 | #include "zend_generators.h" |
| 21 | +#include "zend_exceptions.h" |
21 | 22 |
|
22 | 23 | static zend_observer_fcall_handlers observer_fcall_init(zend_execute_data *execute_data); |
23 | 24 |
|
@@ -125,6 +126,11 @@ static void observer_end(zend_execute_data *execute_data, zval *retval) |
125 | 126 | { |
126 | 127 | assert_observer_opline(execute_data); |
127 | 128 |
|
| 129 | + if (ZT_G(observer_set_vm_interrupt_on_end) && !EG(exception)) { |
| 130 | + ZT_G(observer_throw_on_vm_interrupt) = true; |
| 131 | + atomic_store(&EG(vm_interrupt), true); |
| 132 | + } |
| 133 | + |
128 | 134 | if (!ZT_G(observer_show_output)) { |
129 | 135 | return; |
130 | 136 | } |
@@ -154,6 +160,11 @@ static void zend_test_interrupt_function(zend_execute_data *execute_data) |
154 | 160 | if (zend_test_prev_interrupt_function) { |
155 | 161 | zend_test_prev_interrupt_function(execute_data); |
156 | 162 | } |
| 163 | + |
| 164 | + if (ZT_G(observer_throw_on_vm_interrupt)) { |
| 165 | + ZT_G(observer_throw_on_vm_interrupt) = false; |
| 166 | + zend_throw_exception(NULL, "VM interrupt", 0); |
| 167 | + } |
157 | 168 | } |
158 | 169 |
|
159 | 170 | static void observer_show_init(zend_function *fbc) |
@@ -397,6 +408,7 @@ PHP_INI_BEGIN() |
397 | 408 | 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) |
398 | 409 | 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) |
399 | 410 | STD_PHP_INI_BOOLEAN("zend_test.observer.set_vm_interrupt_on_begin_without_callback", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_set_vm_interrupt_on_begin_without_callback, zend_zend_test_globals, zend_test_globals) |
| 411 | + STD_PHP_INI_BOOLEAN("zend_test.observer.set_vm_interrupt_on_end", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_set_vm_interrupt_on_end, zend_zend_test_globals, zend_test_globals) |
400 | 412 | STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_init", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_init, zend_zend_test_globals, zend_test_globals) |
401 | 413 | STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_switch", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_switch, zend_zend_test_globals, zend_test_globals) |
402 | 414 | STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_destroy", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_destroy, zend_zend_test_globals, zend_test_globals) |
@@ -439,7 +451,7 @@ void zend_test_observer_init(INIT_FUNC_ARGS) |
439 | 451 | zend_execute_internal = zend_test_execute_internal; |
440 | 452 | } |
441 | 453 |
|
442 | | - if (ZT_G(observer_set_vm_interrupt_on_begin)) { |
| 454 | + if (ZT_G(observer_set_vm_interrupt_on_begin) || ZT_G(observer_set_vm_interrupt_on_end)) { |
443 | 455 | zend_test_prev_interrupt_function = zend_interrupt_function; |
444 | 456 | zend_interrupt_function = zend_test_interrupt_function; |
445 | 457 | } |
|
0 commit comments