fix(optimizer): convert dynamic array_keys strict flag

master
hafung 13 hours ago
parent 1488563a27
commit d8b9dc1a00
  1. 3
      src/Optimizer/FuncCallOptimizer.php
  2. 89
      tests/compiler/stdlib/array-keys-dynamic-arguments.phpt

@ -770,7 +770,8 @@ trait FuncCallOptimizer
{
$cnt = count($e->args);
if ($cnt >= 3) {
return 'php::fn::array_keys_filter(' . $this->getArg($e, 0) . ', ' . $this->getArg($e, 1) . ', ' . $this->getArg($e, 2) . ')';
return 'php::fn::array_keys_filter(' . $this->getArg($e, 0) . ', ' . $this->getArg($e, 1) . ', '
. $this->resolveArg($e, 2, self::ARG_TYPE_BOOL) . ')';
}
if ($cnt >= 2) {
return 'php::fn::array_keys_filter(' . $this->getArg($e, 0) . ', ' . $this->getArg($e, 1) . ', false)';

@ -0,0 +1,89 @@
--TEST--
array_keys optimized calls convert dynamic arguments and preserve evaluation order
--FILE--
<?php
declare(strict_types=1);
final class ArrayKeysOptions
{
public bool $strict = true;
}
function arrayKeysDynamicStrict(array &$events): bool
{
$events[] = 'strict';
return true;
}
function arrayKeysDynamicValues(array &$events): array
{
$events[] = 'array';
return ['integer' => 1, 'string' => '1'];
}
function arrayKeysDynamicFilter(array &$events): mixed
{
$events[] = 'filter';
return '1';
}
function main()
{
$values = ['integer' => 1, 'string' => '1'];
var_dump(array_keys($values));
var_dump(array_keys($values, '1'));
var_dump(array_keys($values, '1', true));
$strict = true;
var_dump(array_keys($values, '1', $strict));
$options = new ArrayKeysOptions();
var_dump(array_keys($values, '1', $options->strict));
$events = [];
var_dump(array_keys(
arrayKeysDynamicValues($events),
arrayKeysDynamicFilter($events),
arrayKeysDynamicStrict($events)
));
var_dump($events);
}
?>
--EXPECT--
array(2) {
[0]=>
string(7) "integer"
[1]=>
string(6) "string"
}
array(2) {
[0]=>
string(7) "integer"
[1]=>
string(6) "string"
}
array(1) {
[0]=>
string(6) "string"
}
array(1) {
[0]=>
string(6) "string"
}
array(1) {
[0]=>
string(6) "string"
}
array(1) {
[0]=>
string(6) "string"
}
array(3) {
[0]=>
string(5) "array"
[1]=>
string(6) "filter"
[2]=>
string(6) "strict"
}
Loading…
Cancel
Save