diff --git a/UPGRADING b/UPGRADING index 7b264b0703bc1..0cc0c88679c68 100644 --- a/UPGRADING +++ b/UPGRADING @@ -588,6 +588,8 @@ PHP 8.5 UPGRADE NOTES . The high resolution timer (`hrtime()`) on macOS now uses the recommended `clock_gettime_nsec_np(CLOCK_UPTIME_RAW)` API instead of `mach_absolute_time()`. + . Destructors are now invoked correctly after bailout, to match the behavior + of shutdown handlers. - CLI/CGI: . The `-z` or `--zend-extension` option has been removed as it was diff --git a/Zend/tests/fibers/fatal-error-with-multiple-fibers.phpt b/Zend/tests/fibers/fatal-error-with-multiple-fibers.phpt index 875364c3f6b02..900d0bf5b8842 100644 --- a/Zend/tests/fibers/fatal-error-with-multiple-fibers.phpt +++ b/Zend/tests/fibers/fatal-error-with-multiple-fibers.phpt @@ -7,7 +7,7 @@ $fiber1 = new Fiber(function (): void { try { \Fiber::suspend(1); } finally { - echo "not executed"; + echo "executed"; } }); @@ -28,3 +28,4 @@ int(2) Deprecated: Passing E_USER_ERROR to trigger_error() is deprecated since 8.4, throw an exception or call exit with a string message instead in %s on line %d Fatal error: Fatal error in fiber in %sfatal-error-with-multiple-fibers.php on line %d +executed \ No newline at end of file diff --git a/Zend/tests/invoke_destructors_after_bailout.phpt b/Zend/tests/invoke_destructors_after_bailout.phpt new file mode 100644 index 0000000000000..344eb891c1799 --- /dev/null +++ b/Zend/tests/invoke_destructors_after_bailout.phpt @@ -0,0 +1,40 @@ +--TEST-- +Invoke destructors after bailout +--SKIPIF-- + +--FILE-- +stats)."\n"; + } + + public function inc(string $key, int $by = 1): void { + $this->stats[$key] ??= 0; + $this->stats[$key] += $by; + } +} + +StatCounter::get()->inc('test'); +StatCounter::get()->inc('test2'); + +set_time_limit(1); +while (1); + +?> +--EXPECTF-- + +Fatal error: Maximum execution time of 1 second exceeded in %s on line %d +Sending stats: {"test":1,"test2":1} diff --git a/ext/zend_test/tests/observer_fiber_functions_03.phpt b/ext/zend_test/tests/observer_fiber_functions_03.phpt index 8e267ea65a037..e5ddade241216 100644 --- a/ext/zend_test/tests/observer_fiber_functions_03.phpt +++ b/ext/zend_test/tests/observer_fiber_functions_03.phpt @@ -87,3 +87,12 @@ Fatal error: Allowed memory size of 104857600 bytes exhausted %s on line %d + + + + + + + + + \ No newline at end of file diff --git a/main/main.c b/main/main.c index 3518e4137ecef..c452015545a3f 100644 --- a/main/main.c +++ b/main/main.c @@ -1474,7 +1474,6 @@ static ZEND_COLD void php_error_cb(int orig_type, zend_string *error_filename, c if (!(orig_type & E_DONT_BAIL)) { /* restore memory limit */ zend_set_memory_limit(PG(memory_limit)); - zend_objects_store_mark_destructed(&EG(objects_store)); if (CG(in_compilation) && (type == E_COMPILE_ERROR || type == E_PARSE)) { /* We bailout during compilation which may for example leave stale entries in CG(loop_var_stack). * If code is compiled during shutdown, we need to make sure the compiler is reset to a clean state,