Skip to content

Commit f1d1263

Browse files
committed
Update comment, add tests
1 parent 96310e7 commit f1d1263

File tree

3 files changed

+144
-5
lines changed

3 files changed

+144
-5
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
--TEST--
2+
PFA optimization: PFA with named args and placeholders can be optimized
3+
--EXTENSIONS--
4+
opcache
5+
--INI--
6+
opcache.opt_debug_level=0x20000
7+
opcache.enable=1
8+
opcache.enable_cli=1
9+
opcache.file_cache=
10+
opcache.file_cache_only=0
11+
--FILE--
12+
<?php
13+
14+
if (time() > 0) {
15+
function foo($a, $b) {
16+
var_dump($a, $b);
17+
}
18+
}
19+
20+
1 |> foo(?, b: 2);
21+
22+
?>
23+
--EXPECTF--
24+
$_main:
25+
; (lines=11, args=0, vars=0, tmps=2)
26+
; (after optimizer)
27+
; %s:1-12
28+
0000 INIT_FCALL 0 %d string("time")
29+
0001 V1 = DO_ICALL
30+
0002 T0 = IS_SMALLER int(0) V1
31+
0003 JMPZ T0 0005
32+
0004 DECLARE_FUNCTION string("foo") 0
33+
0005 INIT_FCALL_BY_NAME 1 string("foo")
34+
0006 SEND_VAL_EX int(1) 1
35+
0007 SEND_VAL_EX int(2) string("b")
36+
0008 CHECK_UNDEF_ARGS
37+
0009 DO_FCALL_BY_NAME
38+
0010 RETURN int(1)
39+
40+
foo:
41+
; (lines=7, args=2, vars=2, tmps=0)
42+
; (after optimizer)
43+
; %s:4-6
44+
0000 CV0($a) = RECV 1
45+
0001 CV1($b) = RECV 2
46+
0002 INIT_FCALL 2 %d string("var_dump")
47+
0003 SEND_VAR CV0($a) 1
48+
0004 SEND_VAR CV1($b) 2
49+
0005 DO_ICALL
50+
0006 RETURN null
51+
int(1)
52+
int(2)
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
--TEST--
2+
PFA optimization: PFA with named args and a variadic placeholder can not be optimized
3+
--EXTENSIONS--
4+
opcache
5+
--INI--
6+
opcache.opt_debug_level=0x20000
7+
opcache.enable=1
8+
opcache.enable_cli=1
9+
opcache.file_cache=
10+
opcache.file_cache_only=0
11+
--FILE--
12+
<?php
13+
14+
if (time() > 0) {
15+
function foo($a, $b) {
16+
var_dump($a, $b);
17+
}
18+
}
19+
20+
1 |> foo(b: 2, ...);
21+
22+
?>
23+
--EXPECTF--
24+
$_main:
25+
; (lines=12, args=0, vars=0, tmps=2)
26+
; (after optimizer)
27+
; %s:1-12
28+
0000 INIT_FCALL 0 %d string("time")
29+
0001 V1 = DO_ICALL
30+
0002 T0 = IS_SMALLER int(0) V1
31+
0003 JMPZ T0 0005
32+
0004 DECLARE_FUNCTION string("foo") 0
33+
0005 INIT_FCALL_BY_NAME 0 string("foo")
34+
0006 SEND_VAL_EX int(2) string("b")
35+
0007 T0 = CALLABLE_CONVERT_PARTIAL 3
36+
0008 INIT_DYNAMIC_CALL 1 T0
37+
0009 SEND_VAL_EX int(1) 1
38+
0010 DO_FCALL
39+
0011 RETURN int(1)
40+
41+
foo:
42+
; (lines=7, args=2, vars=2, tmps=0)
43+
; (after optimizer)
44+
; %s:4-6
45+
0000 CV0($a) = RECV 1
46+
0001 CV1($b) = RECV 2
47+
0002 INIT_FCALL 2 %d string("var_dump")
48+
0003 SEND_VAR CV0($a) 1
49+
0004 SEND_VAR CV1($b) 2
50+
0005 DO_ICALL
51+
0006 RETURN null
52+
53+
$_main:
54+
; (lines=4, args=0, vars=1, tmps=1)
55+
; (after optimizer)
56+
; %s:1-9
57+
0000 T1 = DECLARE_LAMBDA_FUNCTION 0
58+
0001 BIND_LEXICAL T1 CV0($b)
59+
0002 FREE T1
60+
0003 RETURN int(1)
61+
LIVE RANGES:
62+
1: 0001 - 0002 (tmp/var)
63+
64+
{closure:pfa:%s:9}:
65+
; (lines=18, args=1, vars=2, tmps=2)
66+
; (after optimizer)
67+
; %s:9-9
68+
0000 CV0($a) = RECV 1
69+
0001 BIND_STATIC CV1($b)
70+
0002 T3 = FUNC_NUM_ARGS
71+
0003 T2 = IS_SMALLER_OR_EQUAL T3 int(1)
72+
0004 JMPZ T2 0010
73+
0005 INIT_FCALL 2 112 string("foo")
74+
0006 SEND_VAR CV0($a) 1
75+
0007 SEND_VAR CV1($b) 2
76+
0008 V2 = DO_UCALL
77+
0009 RETURN V2
78+
0010 INIT_FCALL 2 112 string("foo")
79+
0011 SEND_VAR CV0($a) 1
80+
0012 SEND_VAR CV1($b) 2
81+
0013 T2 = FUNC_GET_ARGS int(1)
82+
0014 SEND_UNPACK T2
83+
0015 CHECK_UNDEF_ARGS
84+
0016 V2 = DO_UCALL
85+
0017 RETURN V2
86+
int(1)
87+
int(2)

Zend/zend_compile.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6741,11 +6741,11 @@ static zend_ast *zend_partial_apply(zend_ast *callable_ast, zend_ast *pipe_arg)
67416741
return NULL;
67426742
}
67436743
if (arg->attr == ZEND_PLACEHOLDER_VARIADIC && uses_named_args) {
6744-
/* PFAs with both a variadic placeholder and named args can not
6745-
* be optimized because the named arg may resolve to the
6746-
* position of the placeholder: f(..., name: $v).
6747-
* Arg placeholders ('?') are safe, as named args are not
6748-
* allowed to override them. */
6744+
/* A PFA with both a variadic placeholder and named args can not
6745+
* be optimized because this would result in a positional arg
6746+
* after a named arg: f(name: $v, ...) -> f(name: $v, pipe_arg).
6747+
* Arg placeholders ('?') are safe since they are not allowed
6748+
* after named args. */
67496749
return NULL;
67506750
}
67516751
}

0 commit comments

Comments
 (0)