From 6c86805c665c14091fe6d2980b7d7f3ec4e826e5 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 18 Jan 2022 15:32:16 +0100 Subject: [PATCH 1/8] Fix print_r exception handling, no fatal error --- Zend/tests/gh7922.phpt | 21 +++++++++++++++++++++ Zend/zend_object_handlers.c | 37 ++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 Zend/tests/gh7922.phpt diff --git a/Zend/tests/gh7922.phpt b/Zend/tests/gh7922.phpt new file mode 100644 index 000000000000..17145fd6e9f0 --- /dev/null +++ b/Zend/tests/gh7922.phpt @@ -0,0 +1,21 @@ +--TEST-- +GH-7922 (print_r should not produce a fatal error) +--FILE-- +getMessage(); +} +?> +--EXPECT-- +__debuginfo() must return an array diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index d767e8399785..2dffb9ce633c 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -164,27 +164,30 @@ ZEND_API HashTable *zend_std_get_debug_info(zend_object *object, int *is_temp) / } zend_call_known_instance_method_with_0_params(ce->__debugInfo, object, &retval); - if (Z_TYPE(retval) == IS_ARRAY) { - if (!Z_REFCOUNTED(retval)) { - *is_temp = 1; - return zend_array_dup(Z_ARRVAL(retval)); - } else if (Z_REFCOUNT(retval) <= 1) { + switch (Z_TYPE(retval)) { + case IS_ARRAY: + if (!Z_REFCOUNTED(retval)) { + *is_temp = 1; + return zend_array_dup(Z_ARRVAL(retval)); + } else if (Z_REFCOUNT(retval) <= 1) { + *is_temp = 1; + ht = Z_ARR(retval); + return ht; + } else { + *is_temp = 0; + zval_ptr_dtor(&retval); + return Z_ARRVAL(retval); + } + default: + zend_throw_error(NULL, ZEND_DEBUGINFO_FUNC_NAME "() must return an array"); + zval_ptr_dtor(&retval); + /* fallthrough */ + case IS_NULL: *is_temp = 1; - ht = Z_ARR(retval); + ht = zend_new_array(0); return ht; - } else { - *is_temp = 0; - zval_ptr_dtor(&retval); - return Z_ARRVAL(retval); - } - } else if (Z_TYPE(retval) == IS_NULL) { - *is_temp = 1; - ht = zend_new_array(0); - return ht; } - zend_error_noreturn(E_ERROR, ZEND_DEBUGINFO_FUNC_NAME "() must return an array"); - return NULL; /* Compilers are dumb and don't understand that noreturn means that the function does NOT need a return value... */ } /* }}} */ From a1ccd0739fdf44c80d5a48d2db4ea945e1b998d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 25 Jun 2022 11:12:03 +0200 Subject: [PATCH 2/8] extend test --- Zend/tests/gh7922.phpt | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/Zend/tests/gh7922.phpt b/Zend/tests/gh7922.phpt index 17145fd6e9f0..2b859c02dda8 100644 --- a/Zend/tests/gh7922.phpt +++ b/Zend/tests/gh7922.phpt @@ -4,7 +4,7 @@ GH-7922 (print_r should not produce a fatal error) getMessage(); + echo (string) $e . "\n"; } ?> ---EXPECT-- -__debuginfo() must return an array +--EXPECTF-- +Error: x in %s:6 +Stack trace: +#0 [internal function]: A->__debugInfo() +#1 %s(12): print_r(Object(A)) +#2 {main} + +Exception: y in %s:21 +Stack trace: +#0 [internal function]: A@anonymous->__debugInfo() +#1 %s(24): print_r(Object(A@anonymous), true) +#2 {main} From 4079a07d85a123fbcfb06bdcee31829817d22fa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Tue, 28 Jun 2022 11:45:01 +0200 Subject: [PATCH 3/8] adjust existing tests for non-fatal error --- Zend/tests/debug_info-error-0.0.phpt | 6 +++++- Zend/tests/debug_info-error-0.phpt | 6 +++++- Zend/tests/debug_info-error-1.0.phpt | 6 +++++- Zend/tests/debug_info-error-1.phpt | 6 +++++- Zend/tests/debug_info-error-empty_str.phpt | 6 +++++- Zend/tests/debug_info-error-false.phpt | 6 +++++- Zend/tests/debug_info-error-object.phpt | 6 +++++- Zend/tests/debug_info-error-resource.phpt | 6 +++++- Zend/tests/debug_info-error-str.phpt | 6 +++++- Zend/tests/debug_info-error-true.phpt | 6 +++++- 10 files changed, 50 insertions(+), 10 deletions(-) diff --git a/Zend/tests/debug_info-error-0.0.phpt b/Zend/tests/debug_info-error-0.0.phpt index e3996e0f2599..fdcdf30a9b74 100644 --- a/Zend/tests/debug_info-error-0.0.phpt +++ b/Zend/tests/debug_info-error-0.0.phpt @@ -17,4 +17,8 @@ $c = new C(0.0); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-0.0.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-0.0.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-0.phpt b/Zend/tests/debug_info-error-0.phpt index 7dbac320a175..49f23ce8ce3a 100644 --- a/Zend/tests/debug_info-error-0.phpt +++ b/Zend/tests/debug_info-error-0.phpt @@ -17,4 +17,8 @@ $c = new C(0); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-0.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-0.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-1.0.phpt b/Zend/tests/debug_info-error-1.0.phpt index 0213e9daad25..08c092fb4169 100644 --- a/Zend/tests/debug_info-error-1.0.phpt +++ b/Zend/tests/debug_info-error-1.0.phpt @@ -17,4 +17,8 @@ $c = new C(1.0); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-1.0.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-1.0.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-1.phpt b/Zend/tests/debug_info-error-1.phpt index a8e4644b4908..3c023911c08d 100644 --- a/Zend/tests/debug_info-error-1.phpt +++ b/Zend/tests/debug_info-error-1.phpt @@ -17,4 +17,8 @@ $c = new C(1); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-1.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-1.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-empty_str.phpt b/Zend/tests/debug_info-error-empty_str.phpt index 39f227cb9675..3553864bec76 100644 --- a/Zend/tests/debug_info-error-empty_str.phpt +++ b/Zend/tests/debug_info-error-empty_str.phpt @@ -17,4 +17,8 @@ $c = new C(""); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-empty_str.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-empty_str.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-false.phpt b/Zend/tests/debug_info-error-false.phpt index bf18ed4d038d..79ad1ebf8b70 100644 --- a/Zend/tests/debug_info-error-false.phpt +++ b/Zend/tests/debug_info-error-false.phpt @@ -17,4 +17,8 @@ $c = new C(false); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-false.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-false.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-object.phpt b/Zend/tests/debug_info-error-object.phpt index e94c2dfb36cc..de2b337d470a 100644 --- a/Zend/tests/debug_info-error-object.phpt +++ b/Zend/tests/debug_info-error-object.phpt @@ -17,4 +17,8 @@ $c = new C(new stdClass); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-object.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-object.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-resource.phpt b/Zend/tests/debug_info-error-resource.phpt index 285ed72e3307..dde17063f452 100644 --- a/Zend/tests/debug_info-error-resource.phpt +++ b/Zend/tests/debug_info-error-resource.phpt @@ -19,4 +19,8 @@ $c = new C(fopen("data:text/plain,Foo", 'r')); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-resource.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-resource.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-str.phpt b/Zend/tests/debug_info-error-str.phpt index daf0ad3b588e..1ab731f16205 100644 --- a/Zend/tests/debug_info-error-str.phpt +++ b/Zend/tests/debug_info-error-str.phpt @@ -17,4 +17,8 @@ $c = new C("foo"); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-str.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-str.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 diff --git a/Zend/tests/debug_info-error-true.phpt b/Zend/tests/debug_info-error-true.phpt index 41a68c5c3965..e343e4217cc7 100644 --- a/Zend/tests/debug_info-error-true.phpt +++ b/Zend/tests/debug_info-error-true.phpt @@ -17,4 +17,8 @@ $c = new C(true); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-true.php on line %d +Fatal error: Uncaught Error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-true.php:14 +Stack trace: +#0 %s(14): var_dump(Object(C)) +#1 {main} + thrown in %s on line 14 From 6622d98101b344454d67a5479946c7b6b02e619c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 25 Jun 2022 13:24:14 +0200 Subject: [PATCH 4/8] test exception from destructor --- Zend/tests/gh7922.phpt | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/Zend/tests/gh7922.phpt b/Zend/tests/gh7922.phpt index 2b859c02dda8..58d7a92f0c97 100644 --- a/Zend/tests/gh7922.phpt +++ b/Zend/tests/gh7922.phpt @@ -28,6 +28,44 @@ try { } catch (\Throwable $e) { echo (string) $e . "\n"; } + +try { + $a = new class() extends A { + public function __debugInfo(): array + { + new class() { + public function __destruct() + { + throw new \Exception('z_wo_assign'); + } + }; + + return ['foo' => 2]; + } + }; + print_r($a); +} catch (\Throwable $e) { + echo (string) $e . "\n"; +} + +try { + $a = new class() extends A { + public function __debugInfo(): array + { + $o = new class() { + public function __destruct() + { + throw new \Exception('z_w_assign'); + } + }; + + return ['foo' => 2]; + } + }; + print_r($a); +} catch (\Throwable $e) { + echo (string) $e . "\n"; +} ?> --EXPECTF-- Error: x in %s:6 @@ -41,3 +79,15 @@ Stack trace: #0 [internal function]: A@anonymous->__debugInfo() #1 %s(24): print_r(Object(A@anonymous), true) #2 {main} + +Exception: z_wo_assign in %s:35 +Stack trace: +#0 [internal function]: A@anonymous->__destruct() +#1 %s(42): print_r(Object(A@anonymous)) +#2 {main} + +Exception: z_w_assign in %s:54 +Stack trace: +#0 [internal function]: A@anonymous->__destruct() +#1 %s(61): print_r(Object(A@anonymous)) +#2 {main} From 509af2ded868431ebdf519044f46358353dd2e27 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sun, 24 Jul 2022 19:58:44 +0200 Subject: [PATCH 5/8] Stop execution of print_r on error --- Zend/tests/debug_info-error-0.phpt | 2 +- Zend/tests/gh7922.phpt | 82 ++++++++++++++++-------------- Zend/zend_object_handlers.c | 13 +++-- ext/standard/var.c | 3 ++ 4 files changed, 57 insertions(+), 43 deletions(-) diff --git a/Zend/tests/debug_info-error-0.phpt b/Zend/tests/debug_info-error-0.phpt index 49f23ce8ce3a..2aef18b69c7a 100644 --- a/Zend/tests/debug_info-error-0.phpt +++ b/Zend/tests/debug_info-error-0.phpt @@ -17,7 +17,7 @@ $c = new C(0); var_dump($c); ?> --EXPECTF-- -Fatal error: Uncaught Error: __debuginfo() must return an array in __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-0.php:14 +Fatal error: Uncaught Error: __debuginfo() must return an array in %s:%d Stack trace: #0 %s(14): var_dump(Object(C)) #1 {main} diff --git a/Zend/tests/gh7922.phpt b/Zend/tests/gh7922.phpt index 58d7a92f0c97..27cc0f271782 100644 --- a/Zend/tests/gh7922.phpt +++ b/Zend/tests/gh7922.phpt @@ -10,84 +10,90 @@ class A } } +echo "Exception in __debugInfo:\n"; + try { - $a = new A(); - print_r($a); + print_r(new A()); } catch (\Throwable $e) { - echo (string) $e . "\n"; + echo $e . "\n"; } +echo "\nException in __debugInfo in anonymous class:\n"; + try { - $a = new class() extends A { + print_r(new class() extends A { public function __debugInfo(): array { throw new \Exception('y'); } - }; - print_r($a, true); + }); } catch (\Throwable $e) { - echo (string) $e . "\n"; + echo $e . "\n"; } +echo "\nException in __destruct of __debugInfo in anonymous class:\n"; + try { - $a = new class() extends A { + print_r(new class() extends A { public function __debugInfo(): array { - new class() { + $o = new class() { public function __destruct() { - throw new \Exception('z_wo_assign'); + throw new \Exception('z_w_assign'); } }; return ['foo' => 2]; } - }; - print_r($a); + }); } catch (\Throwable $e) { - echo (string) $e . "\n"; + echo $e . "\n"; } -try { - $a = new class() extends A { - public function __debugInfo(): array - { - $o = new class() { - public function __destruct() - { - throw new \Exception('z_w_assign'); - } - }; +echo "\nException occuring later on:\n"; - return ['foo' => 2]; - } - }; - print_r($a); +try { + print_r(['foo' => 'bar', 'baz' => new A()]); } catch (\Throwable $e) { - echo (string) $e . "\n"; + echo $e . "\n"; } + ?> --EXPECTF-- -Error: x in %s:6 +Exception in __debugInfo: +A Object +Error: x in %s:%d Stack trace: #0 [internal function]: A->__debugInfo() -#1 %s(12): print_r(Object(A)) +#1 %s(%d): print_r(Object(A)) #2 {main} -Exception: y in %s:21 +Exception in __debugInfo in anonymous class: +A@anonymous Object +Exception: y in %s:%d Stack trace: #0 [internal function]: A@anonymous->__debugInfo() -#1 %s(24): print_r(Object(A@anonymous), true) +#1 %s(%d): print_r(Object(A@anonymous)) #2 {main} -Exception: z_wo_assign in %s:35 +Exception in __destruct of __debugInfo in anonymous class: +A@anonymous Object +Exception: z_w_assign in %s:%d Stack trace: -#0 [internal function]: A@anonymous->__destruct() -#1 %s(42): print_r(Object(A@anonymous)) +#0 [internal function]: class@anonymous->__destruct() +#1 %s(%d): print_r(Object(A@anonymous)) #2 {main} -Exception: z_w_assign in %s:54 +Exception occuring later on: +Array +( + [foo] => bar + [baz] => A Object + +) +Error: x in %s:%d Stack trace: -#0 [internal function]: A@anonymous->__destruct() -#1 %s(61): print_r(Object(A@anonymous)) +#0 [internal function]: A->__debugInfo() +#1 %s(%d): print_r(Array) #2 {main} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 2dffb9ce633c..5769e02f8d0b 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -164,6 +164,11 @@ ZEND_API HashTable *zend_std_get_debug_info(zend_object *object, int *is_temp) / } zend_call_known_instance_method_with_0_params(ce->__debugInfo, object, &retval); + if (EG(exception)) { + zval_ptr_dtor(&retval); + return NULL; + } + switch (Z_TYPE(retval)) { case IS_ARRAY: if (!Z_REFCOUNTED(retval)) { @@ -178,14 +183,14 @@ ZEND_API HashTable *zend_std_get_debug_info(zend_object *object, int *is_temp) / zval_ptr_dtor(&retval); return Z_ARRVAL(retval); } - default: - zend_throw_error(NULL, ZEND_DEBUGINFO_FUNC_NAME "() must return an array"); - zval_ptr_dtor(&retval); - /* fallthrough */ case IS_NULL: *is_temp = 1; ht = zend_new_array(0); return ht; + default: + zend_throw_error(NULL, ZEND_DEBUGINFO_FUNC_NAME "() must return an array"); + zval_ptr_dtor(&retval); + return NULL; } return NULL; /* Compilers are dumb and don't understand that noreturn means that the function does NOT need a return value... */ diff --git a/ext/standard/var.c b/ext/standard/var.c index 268c535a8024..e4e8c7f25652 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -161,6 +161,9 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ Z_PROTECT_RECURSION_P(struc); myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_DEBUG); + if (EG(exception)) { + break; + } class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc)); php_printf("%sobject(%s)#%d (%d) {\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0); zend_string_release_ex(class_name, 0); From 8bc6526ba47adf77a539fb67b9089d158af78382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 12 Nov 2022 13:32:15 +0100 Subject: [PATCH 6/8] adjust ffi "Use after free" test --- ext/ffi/tests/035.phpt | 2 -- 1 file changed, 2 deletions(-) diff --git a/ext/ffi/tests/035.phpt b/ext/ffi/tests/035.phpt index b36f24670814..f09bb101cfd3 100644 --- a/ext/ffi/tests/035.phpt +++ b/ext/ffi/tests/035.phpt @@ -23,6 +23,4 @@ object(FFI\CData:uint16_t[2])#%d (2) { [1]=> int(0) } -object(FFI\CData:uint16_t[2])#%d (0) { -} FFI\Exception: Use after free() From a6b54d8283e1b506f728130fcbc495f6dfba2c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 12 Nov 2022 13:33:43 +0100 Subject: [PATCH 7/8] adjust test, no partial/wrong output --- Zend/tests/gh7922.phpt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Zend/tests/gh7922.phpt b/Zend/tests/gh7922.phpt index 27cc0f271782..ec03e7d066db 100644 --- a/Zend/tests/gh7922.phpt +++ b/Zend/tests/gh7922.phpt @@ -62,7 +62,6 @@ try { ?> --EXPECTF-- Exception in __debugInfo: -A Object Error: x in %s:%d Stack trace: #0 [internal function]: A->__debugInfo() @@ -70,7 +69,6 @@ Stack trace: #2 {main} Exception in __debugInfo in anonymous class: -A@anonymous Object Exception: y in %s:%d Stack trace: #0 [internal function]: A@anonymous->__debugInfo() @@ -78,7 +76,6 @@ Stack trace: #2 {main} Exception in __destruct of __debugInfo in anonymous class: -A@anonymous Object Exception: z_w_assign in %s:%d Stack trace: #0 [internal function]: class@anonymous->__destruct() @@ -86,12 +83,6 @@ Stack trace: #2 {main} Exception occuring later on: -Array -( - [foo] => bar - [baz] => A Object - -) Error: x in %s:%d Stack trace: #0 [internal function]: A->__debugInfo() From b847cf17faa613c7cfdff9573ea74e835be965db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 12 Nov 2022 14:09:00 +0100 Subject: [PATCH 8/8] test var_dump with ex. in array item --- Zend/tests/gh7922.phpt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Zend/tests/gh7922.phpt b/Zend/tests/gh7922.phpt index ec03e7d066db..69bb25d53926 100644 --- a/Zend/tests/gh7922.phpt +++ b/Zend/tests/gh7922.phpt @@ -51,7 +51,7 @@ try { echo $e . "\n"; } -echo "\nException occuring later on:\n"; +echo "\nException occuring later on (print_r):\n"; try { print_r(['foo' => 'bar', 'baz' => new A()]); @@ -59,6 +59,14 @@ try { echo $e . "\n"; } +echo "\nException occuring later on (var_dump):\n"; + +try { + var_dump(['u' => 1], ['foo' => 'bar', 'baz' => new A()], ['u' => 1]); +} catch (\Throwable $e) { + echo $e . "\n"; +} + ?> --EXPECTF-- Exception in __debugInfo: @@ -82,9 +90,16 @@ Stack trace: #1 %s(%d): print_r(Object(A@anonymous)) #2 {main} -Exception occuring later on: +Exception occuring later on (print_r): Error: x in %s:%d Stack trace: #0 [internal function]: A->__debugInfo() #1 %s(%d): print_r(Array) #2 {main} + +Exception occuring later on (var_dump): +Error: x in %s:%d +Stack trace: +#0 [internal function]: A->__debugInfo() +#1 %s(%d): var_dump(Array) +#2 {main}