Skip to content

Commit d8b9dc1

Browse files
committed
fix(optimizer): convert dynamic array_keys strict flag
1 parent 1488563 commit d8b9dc1

2 files changed

Lines changed: 91 additions & 1 deletion

File tree

src/Optimizer/FuncCallOptimizer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,8 @@ protected function genArrayKeys(string $n, Node\Expr\FuncCall $e, array $c): str
770770
{
771771
$cnt = count($e->args);
772772
if ($cnt >= 3) {
773-
return 'php::fn::array_keys_filter(' . $this->getArg($e, 0) . ', ' . $this->getArg($e, 1) . ', ' . $this->getArg($e, 2) . ')';
773+
return 'php::fn::array_keys_filter(' . $this->getArg($e, 0) . ', ' . $this->getArg($e, 1) . ', '
774+
. $this->resolveArg($e, 2, self::ARG_TYPE_BOOL) . ')';
774775
}
775776
if ($cnt >= 2) {
776777
return 'php::fn::array_keys_filter(' . $this->getArg($e, 0) . ', ' . $this->getArg($e, 1) . ', false)';
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
--TEST--
2+
array_keys optimized calls convert dynamic arguments and preserve evaluation order
3+
--FILE--
4+
<?php
5+
declare(strict_types=1);
6+
7+
final class ArrayKeysOptions
8+
{
9+
public bool $strict = true;
10+
}
11+
12+
function arrayKeysDynamicStrict(array &$events): bool
13+
{
14+
$events[] = 'strict';
15+
return true;
16+
}
17+
18+
function arrayKeysDynamicValues(array &$events): array
19+
{
20+
$events[] = 'array';
21+
return ['integer' => 1, 'string' => '1'];
22+
}
23+
24+
function arrayKeysDynamicFilter(array &$events): mixed
25+
{
26+
$events[] = 'filter';
27+
return '1';
28+
}
29+
30+
function main()
31+
{
32+
$values = ['integer' => 1, 'string' => '1'];
33+
34+
var_dump(array_keys($values));
35+
var_dump(array_keys($values, '1'));
36+
var_dump(array_keys($values, '1', true));
37+
38+
$strict = true;
39+
var_dump(array_keys($values, '1', $strict));
40+
41+
$options = new ArrayKeysOptions();
42+
var_dump(array_keys($values, '1', $options->strict));
43+
44+
$events = [];
45+
var_dump(array_keys(
46+
arrayKeysDynamicValues($events),
47+
arrayKeysDynamicFilter($events),
48+
arrayKeysDynamicStrict($events)
49+
));
50+
var_dump($events);
51+
}
52+
?>
53+
--EXPECT--
54+
array(2) {
55+
[0]=>
56+
string(7) "integer"
57+
[1]=>
58+
string(6) "string"
59+
}
60+
array(2) {
61+
[0]=>
62+
string(7) "integer"
63+
[1]=>
64+
string(6) "string"
65+
}
66+
array(1) {
67+
[0]=>
68+
string(6) "string"
69+
}
70+
array(1) {
71+
[0]=>
72+
string(6) "string"
73+
}
74+
array(1) {
75+
[0]=>
76+
string(6) "string"
77+
}
78+
array(1) {
79+
[0]=>
80+
string(6) "string"
81+
}
82+
array(3) {
83+
[0]=>
84+
string(5) "array"
85+
[1]=>
86+
string(6) "filter"
87+
[2]=>
88+
string(6) "strict"
89+
}

0 commit comments

Comments
 (0)