mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Merge branch 'PHP-8.3'
This commit is contained in:
commit
13c8d9317f
3 changed files with 40 additions and 1 deletions
|
@ -9878,7 +9878,10 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ZEND_OBSERVER_ENABLED) {
|
if (ZEND_OBSERVER_ENABLED) {
|
||||||
if (GCC_GLOBAL_REGS) {
|
if (trace && (trace->op != ZEND_JIT_TRACE_END || trace->stop != ZEND_JIT_TRACE_STOP_INTERPRETER)) {
|
||||||
|
ZEND_ASSERT(trace[1].op == ZEND_JIT_TRACE_VM || trace[1].op == ZEND_JIT_TRACE_END);
|
||||||
|
jit_SET_EX_OPLINE(jit, trace[1].opline);
|
||||||
|
} else if (GCC_GLOBAL_REGS) {
|
||||||
// EX(opline) = opline
|
// EX(opline) = opline
|
||||||
ir_STORE(jit_EX(opline), jit_IP(jit));
|
ir_STORE(jit_EX(opline), jit_IP(jit));
|
||||||
}
|
}
|
||||||
|
|
26
ext/opcache/tests/jit/gh13772.phpt
Normal file
26
ext/opcache/tests/jit/gh13772.phpt
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
--TEST--
|
||||||
|
EX(opline) is correctly set for nested JIT user code calls
|
||||||
|
--EXTENSIONS--
|
||||||
|
opcache
|
||||||
|
zend_test
|
||||||
|
--INI--
|
||||||
|
opcache.enable=1
|
||||||
|
opcache.enable_cli=1
|
||||||
|
zend_test.observer.enabled=1
|
||||||
|
zend_test.observer.observe_all=1
|
||||||
|
zend_test.observer.show_output=0
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function Ack($m, $n) {
|
||||||
|
if ($m == 0) return $n+1;
|
||||||
|
if ($n == 0) return Ack($m-1, 1);
|
||||||
|
return Ack($m - 1, Ack($m, ($n - 1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
var_dump(Ack(3, 3));
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
int(61)
|
||||||
|
|
|
@ -67,8 +67,16 @@ static void observer_show_opcode(zend_execute_data *execute_data)
|
||||||
php_printf("%*s<!-- opcode: '%s' -->\n", 2 * ZT_G(observer_nesting_depth), "", zend_get_opcode_name(EX(opline)->opcode));
|
php_printf("%*s<!-- opcode: '%s' -->\n", 2 * ZT_G(observer_nesting_depth), "", zend_get_opcode_name(EX(opline)->opcode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void assert_observer_opline(zend_execute_data *execute_data) {
|
||||||
|
ZEND_ASSERT(!ZEND_USER_CODE(EX(func)->type) ||
|
||||||
|
(EX(opline) >= EX(func)->op_array.opcodes && EX(opline) < EX(func)->op_array.opcodes + EX(func)->op_array.last) ||
|
||||||
|
(EX(opline) >= EG(exception_op) && EX(opline) < EG(exception_op) + 3));
|
||||||
|
}
|
||||||
|
|
||||||
static void observer_begin(zend_execute_data *execute_data)
|
static void observer_begin(zend_execute_data *execute_data)
|
||||||
{
|
{
|
||||||
|
assert_observer_opline(execute_data);
|
||||||
|
|
||||||
if (!ZT_G(observer_show_output)) {
|
if (!ZT_G(observer_show_output)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -112,6 +120,8 @@ static void get_retval_info(zval *retval, smart_str *buf)
|
||||||
|
|
||||||
static void observer_end(zend_execute_data *execute_data, zval *retval)
|
static void observer_end(zend_execute_data *execute_data, zval *retval)
|
||||||
{
|
{
|
||||||
|
assert_observer_opline(execute_data);
|
||||||
|
|
||||||
if (!ZT_G(observer_show_output)) {
|
if (!ZT_G(observer_show_output)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue