From d8b9dc1a0007ec26c8f9104f402aefefaa974f82 Mon Sep 17 00:00:00 2001 From: hafung <32428762+hafung@users.noreply.github.com> Date: Fri, 28 Aug 2026 10:00:43 +0800 Subject: [PATCH] fix(optimizer): convert dynamic array_keys strict flag --- src/Optimizer/FuncCallOptimizer.php | 3 +- .../stdlib/array-keys-dynamic-arguments.phpt | 89 +++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 tests/compiler/stdlib/array-keys-dynamic-arguments.phpt diff --git a/src/Optimizer/FuncCallOptimizer.php b/src/Optimizer/FuncCallOptimizer.php index e5572bdc..4e60b055 100644 --- a/src/Optimizer/FuncCallOptimizer.php +++ b/src/Optimizer/FuncCallOptimizer.php @@ -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)'; diff --git a/tests/compiler/stdlib/array-keys-dynamic-arguments.phpt b/tests/compiler/stdlib/array-keys-dynamic-arguments.phpt new file mode 100644 index 00000000..b89e4cbd --- /dev/null +++ b/tests/compiler/stdlib/array-keys-dynamic-arguments.phpt @@ -0,0 +1,89 @@ +--TEST-- +array_keys optimized calls convert dynamic arguments and preserve evaluation order +--FILE-- + 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" +}