1--TEST-- 2Stack limit 001 - Stack limit checks with max_allowed_stack_size detection 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-- 11; The test may use a large amount of memory on systems with a large stack limit 12memory_limit=2G 13--FILE-- 14<?php 15 16var_dump(zend_test_zend_call_stack_get()); 17 18class Test1 { 19 public function __destruct() { 20 new Test1; 21 } 22} 23 24class Test2 { 25 public function __clone() { 26 clone $this; 27 } 28} 29 30function replace() { 31 return preg_replace_callback('#.#', function () { 32 return replace(); 33 }, 'x'); 34} 35 36try { 37 new Test1; 38} catch (Error $e) { 39 echo $e->getMessage(), "\n"; 40} 41 42try { 43 clone new Test2; 44} catch (Error $e) { 45 echo $e->getMessage(), "\n"; 46} 47 48try { 49 replace(); 50} catch (Error $e) { 51 echo $e->getMessage(), "\n"; 52} 53 54?> 55--EXPECTF-- 56array(4) { 57 ["base"]=> 58 string(%d) "0x%x" 59 ["max_size"]=> 60 string(%d) "0x%x" 61 ["position"]=> 62 string(%d) "0x%x" 63 ["EG(stack_limit)"]=> 64 string(%d) "0x%x" 65} 66Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 67Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 68Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 69