Skip to content

Commit ce9e167

Browse files
committed
Fix handling of specialized functions
1 parent b2c8810 commit ce9e167

File tree

5 files changed

+18
-4
lines changed

5 files changed

+18
-4
lines changed

Zend/tests/named_params/internal.phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ var_dump(array_slice(length: 2, offset: 2, arg: [1, 2, 3, 4, 5]));
99
var_dump(array_slice(arg: ['a' => 0, 'b' => 1], offset: 1, preserve_keys: true));
1010
var_dump(array_slice(['a' => 0, 'b' => 1], preserve_keys: true, offset: 1));
1111

12+
// Named params work with specialized functions.
13+
var_dump(strlen(str: 'foo'));
14+
1215
?>
1316
--EXPECT--
1417
array(2) {
@@ -31,3 +34,4 @@ array(1) {
3134
["b"]=>
3235
int(1)
3336
}
37+
int(3)

Zend/tests/named_params/internal_variadics.phpt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,15 @@ try {
1515
echo $e->getMessage(), "\n";
1616
}
1717

18+
// TODO: Should this work?
19+
try {
20+
call_user_func('strlen', str: 'foo');
21+
} catch (ArgumentCountError $e) {
22+
echo $e->getMessage(), "\n";
23+
}
24+
1825
?>
1926
--EXPECT--
2027
array_merge() does not accept unknown named parameters
2128
array_diff_key() does not accept unknown named parameters
29+
call_user_func() does not accept unknown named parameters

Zend/zend_API.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1726,7 +1726,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_value_error(uint32_t arg_num
17261726
#define Z_PARAM_VARIADIC(spec, dest, dest_num) \
17271727
Z_PARAM_VARIADIC_EX(spec, dest, dest_num, 0)
17281728

1729-
#define Z_PARAM_VARIADIC_WITH_NAMED(spec, dest, dest_num, dest_named) do { \
1729+
#define Z_PARAM_VARIADIC_WITH_NAMED(dest, dest_num, dest_named) do { \
17301730
int _num_varargs = _num_args - _i; \
17311731
if (EXPECTED(_num_varargs > 0)) { \
17321732
dest = _real_arg + 1; \

Zend/zend_compile.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3466,11 +3466,12 @@ void zend_compile_dynamic_call(znode *result, znode *name_node, zend_ast *args_a
34663466
}
34673467
/* }}} */
34683468

3469-
static inline zend_bool zend_args_contain_unpack(zend_ast_list *args) /* {{{ */
3469+
static inline zend_bool zend_args_contain_unpack_or_named(zend_ast_list *args) /* {{{ */
34703470
{
34713471
uint32_t i;
34723472
for (i = 0; i < args->children; ++i) {
3473-
if (args->child[i]->kind == ZEND_AST_UNPACK) {
3473+
zend_ast *arg = args->child[i];
3474+
if (arg->kind == ZEND_AST_UNPACK || arg->kind == ZEND_AST_NAMED_ARG) {
34743475
return 1;
34753476
}
34763477
}
@@ -4020,7 +4021,7 @@ int zend_try_compile_special_func(znode *result, zend_string *lcname, zend_ast_l
40204021
return FAILURE;
40214022
}
40224023

4023-
if (zend_args_contain_unpack(args)) {
4024+
if (zend_args_contain_unpack_or_named(args)) {
40244025
return FAILURE;
40254026
}
40264027

Zend/zend_execute_API.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
788788
return FAILURE;
789789
}
790790

791+
/* TODO */
791792
/*if (ARG_SHOULD_BE_SENT_BY_REF(func, arg_num)) {
792793
}*/
793794
ZVAL_COPY(target, val);

0 commit comments

Comments
 (0)