1--TEST-- 2Stack limit 002 - Stack limit checks with max_allowed_stack_size detection (fibers) 3--SKIPIF-- 4<?php 5if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_call_stack_get() is not available"); 6if (getenv('SKIP_MSAN')) die("skip msan requires a considerably higher zend.reserved_stack_size due to instrumentation"); 7?> 8--EXTENSIONS-- 9zend_test 10--INI-- 11fiber.stack_size=512k 12--FILE-- 13<?php 14 15var_dump(zend_test_zend_call_stack_get()); 16 17class Test1 { 18 public function __destruct() { 19 new Test1; 20 } 21} 22 23class Test2 { 24 public function __clone() { 25 clone $this; 26 } 27} 28 29class Test3 { 30 public function __sleep() 31 { 32 serialize($this); 33 } 34} 35 36function replace() { 37 return preg_replace_callback('#.#', function () { 38 return replace(); 39 }, 'x'); 40} 41 42$fiber = new Fiber(function (): void { 43 try { 44 new Test1; 45 } catch (Error $e) { 46 echo $e->getMessage(), "\n"; 47 } 48 49 try { 50 clone new Test2; 51 } catch (Error $e) { 52 echo $e->getMessage(), "\n"; 53 } 54 55 try { 56 serialize(new Test3); 57 } catch (Error $e) { 58 echo $e->getMessage(), "\n"; 59 } 60 61 try { 62 replace(); 63 } catch (Error $e) { 64 echo $e->getMessage(), "\n"; 65 } 66}); 67 68$fiber->start(); 69 70?> 71--EXPECTF-- 72array(4) { 73 ["base"]=> 74 string(%d) "0x%x" 75 ["max_size"]=> 76 string(%d) "0x%x" 77 ["position"]=> 78 string(%d) "0x%x" 79 ["EG(stack_limit)"]=> 80 string(%d) "0x%x" 81} 82Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 83Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 84Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 85Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 86