Skip to content

Commit bf32299

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fix GH-8140: Wrong first class callable by name optimization
2 parents b50315e + 33cd61c commit bf32299

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

Zend/Optimizer/optimize_func_calls.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,18 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
190190
fcall->op1.num = zend_vm_calc_used_stack(fcall->extended_value, call_stack[call].func);
191191
literal_dtor(&ZEND_OP2_LITERAL(fcall));
192192
fcall->op2.constant = fcall->op2.constant + 1;
193-
opline->opcode = zend_get_call_op(fcall, call_stack[call].func);
193+
if (opline->opcode != ZEND_CALLABLE_CONVERT) {
194+
opline->opcode = zend_get_call_op(fcall, call_stack[call].func);
195+
}
194196
} else if (fcall->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
195197
fcall->opcode = ZEND_INIT_FCALL;
196198
fcall->op1.num = zend_vm_calc_used_stack(fcall->extended_value, call_stack[call].func);
197199
literal_dtor(&op_array->literals[fcall->op2.constant]);
198200
literal_dtor(&op_array->literals[fcall->op2.constant + 2]);
199201
fcall->op2.constant = fcall->op2.constant + 1;
200-
opline->opcode = zend_get_call_op(fcall, call_stack[call].func);
202+
if (opline->opcode != ZEND_CALLABLE_CONVERT) {
203+
opline->opcode = zend_get_call_op(fcall, call_stack[call].func);
204+
}
201205
} else if (fcall->opcode == ZEND_INIT_STATIC_METHOD_CALL
202206
|| fcall->opcode == ZEND_INIT_METHOD_CALL
203207
|| fcall->opcode == ZEND_NEW) {

ext/opcache/tests/opt/gh8140a.phpt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
GH-8140 (Wrong first class callable by name optimization)
3+
--FILE--
4+
<?php
5+
namespace Test;
6+
7+
function greeter(string $name) {
8+
echo "Hello, ${name}!";
9+
}
10+
11+
$mycallable = greeter(...);
12+
13+
$mycallable("world");
14+
?>
15+
--EXPECT--
16+
Hello, world!

ext/opcache/tests/opt/gh8140b.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
GH-8140 (Wrong first class callable by name optimization)
3+
--FILE--
4+
<?php
5+
$mycallable = greeter(...);
6+
7+
function greeter(string $name) {
8+
echo "Hello, ${name}!";
9+
}
10+
11+
$mycallable("world");
12+
?>
13+
--EXPECT--
14+
Hello, world!

0 commit comments

Comments
 (0)