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