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 30class Test3 { 31 public function __sleep() 32 { 33 serialize($this); 34 } 35} 36 37function replace() { 38 return preg_replace_callback('#.#', function () { 39 return replace(); 40 }, 'x'); 41} 42 43try { 44 new Test1; 45} catch (Error $e) { 46 echo $e->getMessage(), "\n"; 47} 48 49try { 50 clone new Test2; 51} catch (Error $e) { 52 echo $e->getMessage(), "\n"; 53} 54 55try { 56 serialize(new Test3); 57} catch (Error $e) { 58 echo $e->getMessage(), "\n"; 59} 60 61try { 62 replace(); 63} catch (Error $e) { 64 echo $e->getMessage(), "\n"; 65} 66 67?> 68--EXPECTF-- 69array(4) { 70 ["base"]=> 71 string(%d) "0x%x" 72 ["max_size"]=> 73 string(%d) "0x%x" 74 ["position"]=> 75 string(%d) "0x%x" 76 ["EG(stack_limit)"]=> 77 string(%d) "0x%x" 78} 79Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 80Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 81Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 82Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? 83