Skip to content

Commit 3b4514c

Browse files
committed
more variadics
1 parent ed22e97 commit 3b4514c

File tree

5 files changed

+40
-9
lines changed

5 files changed

+40
-9
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
Named variadics nested overwrite param.
3+
--FILE--
4+
<?php
5+
function variadic($one, ...$two) {
6+
return [
7+
func_num_args(),
8+
func_get_args(),
9+
[$one, $two]];
10+
}
11+
12+
$variadic = variadic(?, three: 3);
13+
14+
$variadic =
15+
$variadic(?, four: 4);
16+
17+
$partial = $variadic(one: 1, two: [2], four: 5);
18+
19+
if ($partial[2][1]["four"] == 5) {
20+
echo "OK\n";
21+
} else {
22+
echo "FAIL\n";
23+
24+
var_dump($partial);
25+
}
26+
?>
27+
--EXPECT--
28+
OK

Zend/tests/partial_function/variadics-named-nested.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ $variadic = $variadic(?, four: 4);
1717

1818
$partial = $variadic(one: 1, two: [2]);
1919

20-
if ($partial !== $zend) {
20+
if ($partial != $zend) {
2121
echo "FAIL\n";
2222
var_dump($partial, $zend);
2323
} else {

Zend/zend_partial.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -491,11 +491,14 @@ ZEND_METHOD(Partial, __invoke)
491491
partial->frame.named;
492492
GC_ADDREF(named_args);
493493
} else {
494-
named_args =
495-
zend_array_dup(named_args);
494+
HashTable *nested =
495+
zend_array_dup(partial->frame.named);
496+
496497
zend_hash_merge(
497-
named_args,
498-
partial->frame.named, NULL, true);
498+
nested,
499+
named_args, zval_copy_ctor, true);
500+
501+
named_args = nested;
499502
}
500503
fci.named_params = named_args;
501504
} else {
@@ -578,7 +581,7 @@ void zend_partial_apply(zval *res, zend_execute_data *call) {
578581

579582
zend_hash_merge(
580583
partial->frame.named,
581-
call->extra_named_params, NULL, 1);
584+
call->extra_named_params, zval_copy_ctor, true);
582585
} else {
583586
partial->frame.named =
584587
call->extra_named_params;

Zend/zend_vm_def.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8805,8 +8805,8 @@ ZEND_VM_HANDLER(203, ZEND_PARTIAL_APPLY, ANY, ANY)
88058805
}
88068806

88078807
zend_partial_apply(result, call);
8808-
8809-
if ((ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
8808+
8809+
if (ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
88108810
zend_array_release(call->extra_named_params);
88118811
}
88128812

Zend/zend_vm_execute.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3514,7 +3514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PARTIAL_APPLY_SPEC_HANDLER(ZEN
35143514

35153515
zend_partial_apply(result, call);
35163516

3517-
if ((ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
3517+
if (ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
35183518
zend_array_release(call->extra_named_params);
35193519
}
35203520

0 commit comments

Comments
 (0)