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