From 2a30f2ffc43519deab0d6ed1690e49f21ddc40a2 Mon Sep 17 00:00:00 2001 From: Jorg Adam Sowa Date: Sun, 1 Sep 2024 22:57:12 +0200 Subject: [PATCH] Add type indicator to array/arg unpack error messages (GH-15448) --- Zend/tests/arg_unpack/invalid_type.phpt | 20 +++++++++---------- Zend/tests/array_unpack/undef_var.phpt | 2 +- .../unpack_invalid_type_compile_time.phpt | 2 +- Zend/zend_compile.c | 2 +- Zend/zend_vm_def.h | 8 ++++---- Zend/zend_vm_execute.h | 8 ++++---- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Zend/tests/arg_unpack/invalid_type.phpt b/Zend/tests/arg_unpack/invalid_type.phpt index ad580c37ae9..a0e64937152 100644 --- a/Zend/tests/arg_unpack/invalid_type.phpt +++ b/Zend/tests/arg_unpack/invalid_type.phpt @@ -10,34 +10,34 @@ function test(...$args) { try { test(...null); } catch (Error $e) { - echo $e->getMessage(), "\n"; + echo $e::class . ": " . $e->getMessage(), "\n"; } try { test(...42); } catch (Error $e) { - echo $e->getMessage(), "\n"; + echo $e::class . ": " . $e->getMessage(), "\n"; } try { test(...new stdClass); } catch (Error $e) { - echo $e->getMessage(), "\n"; + echo $e::class . ": " . $e->getMessage(), "\n"; } try { test(1, 2, 3, ..."foo", ...[4, 5]); } catch (Error $e) { - echo $e->getMessage(), "\n"; + echo $e::class . ": " . $e->getMessage(), "\n"; } try { test(1, 2, 3, ...new StdClass, ...3.14, ...[4, 5]); } catch (Error $e) { - echo $e->getMessage(), "\n"; + echo $e::class . ": " . $e->getMessage(), "\n"; } ?> --EXPECT-- -Only arrays and Traversables can be unpacked -Only arrays and Traversables can be unpacked -Only arrays and Traversables can be unpacked -Only arrays and Traversables can be unpacked -Only arrays and Traversables can be unpacked +TypeError: Only arrays and Traversables can be unpacked, null given +TypeError: Only arrays and Traversables can be unpacked, int given +TypeError: Only arrays and Traversables can be unpacked, stdClass given +TypeError: Only arrays and Traversables can be unpacked, string given +TypeError: Only arrays and Traversables can be unpacked, stdClass given diff --git a/Zend/tests/array_unpack/undef_var.phpt b/Zend/tests/array_unpack/undef_var.phpt index 383805c46a2..e38159102ca 100644 --- a/Zend/tests/array_unpack/undef_var.phpt +++ b/Zend/tests/array_unpack/undef_var.phpt @@ -9,7 +9,7 @@ var_dump([...$arr]); --EXPECTF-- Warning: Undefined variable $arr in %s on line %d -Fatal error: Uncaught Error: Only arrays and Traversables can be unpacked in %s:%d +Fatal error: Uncaught Error: Only arrays and Traversables can be unpacked, null given in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt b/Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt index 19297430a5d..d0060a3e247 100644 --- a/Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt +++ b/Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt @@ -7,4 +7,4 @@ var_dump([...42]); ?> --EXPECTF-- -Fatal error: Only arrays and Traversables can be unpacked in %s on line %d +Fatal error: Only arrays and Traversables can be unpacked, int given in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 36231a5610f..63787c902f6 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -9829,7 +9829,7 @@ static bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */ continue; } else { - zend_error_noreturn(E_COMPILE_ERROR, "Only arrays and Traversables can be unpacked"); + zend_error_noreturn(E_COMPILE_ERROR, "Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(value)); } } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b46952a8171..8f77d3f0bfa 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5280,7 +5280,7 @@ ZEND_VM_C_LABEL(send_again): bool have_named_params = 0; if (!ce || !ce->get_iterator) { - zend_type_error("Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args)); } else { iter = ce->get_iterator(ce, args, 0); @@ -5397,7 +5397,7 @@ ZEND_VM_C_LABEL(send_again): if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } - zend_type_error("Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args)); } FREE_OP1(); @@ -6285,7 +6285,7 @@ ZEND_VM_C_LABEL(add_unpack_again): zend_object_iterator *iter; if (!ce || !ce->get_iterator) { - zend_type_error("Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1)); } else { iter = ce->get_iterator(ce, op1, 0); if (UNEXPECTED(!iter)) { @@ -6360,7 +6360,7 @@ ZEND_VM_C_LABEL(add_unpack_again): op1 = Z_REFVAL_P(op1); ZEND_VM_C_GOTO(add_unpack_again); } else { - zend_throw_error(NULL, "Only arrays and Traversables can be unpacked"); + zend_throw_error(NULL, "Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1)); } FREE_OP1(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6738674667e..540779701ce 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2359,7 +2359,7 @@ send_again: bool have_named_params = 0; if (!ce || !ce->get_iterator) { - zend_type_error("Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args)); } else { iter = ce->get_iterator(ce, args, 0); @@ -2476,7 +2476,7 @@ send_again: if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } - zend_type_error("Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args)); } FREE_OP(opline->op1_type, opline->op1.var); @@ -2740,7 +2740,7 @@ add_unpack_again: zend_object_iterator *iter; if (!ce || !ce->get_iterator) { - zend_type_error("Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1)); } else { iter = ce->get_iterator(ce, op1, 0); if (UNEXPECTED(!iter)) { @@ -2815,7 +2815,7 @@ add_unpack_again: op1 = Z_REFVAL_P(op1); goto add_unpack_again; } else { - zend_throw_error(NULL, "Only arrays and Traversables can be unpacked"); + zend_throw_error(NULL, "Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1)); } FREE_OP(opline->op1_type, opline->op1.var);