Skip to content

Commit 8a749c7

Browse files
committed
Tracing JIT: Fixed incorrect code generation fofr SEND-ing of result of ASSIGN to typed reference
1 parent 84b4020 commit 8a749c7

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

ext/opcache/jit/zend_jit_trace.c

+8
Original file line numberDiff line numberDiff line change
@@ -4979,6 +4979,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
49794979
res_addr = 0;
49804980
} else {
49814981
res_addr = RES_REG_ADDR();
4982+
if (Z_MODE(res_addr) != IS_REG
4983+
&& zend_jit_trace_next_is_send_result(opline, p, frame)) {
4984+
send_result = 1;
4985+
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, (opline+1)->result.var);
4986+
if (!zend_jit_reuse_ip(&dasm_state)) {
4987+
goto jit_failure;
4988+
}
4989+
}
49824990
}
49834991
if (!zend_jit_assign_to_typed_ref(&dasm_state, opline, opline->op2_type, op2_addr, res_addr, 1)) {
49844992
goto jit_failure;

ext/opcache/tests/jit/assign_056.phpt

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
JIT ASSIGN: ASSING+SEND and typed reference
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
opcache.protect_memory=1
9+
--FILE--
10+
<?php
11+
class Test {
12+
static ?Test $test;
13+
}
14+
15+
$a = new Test;
16+
Test::$test = &$a;
17+
var_dump($a = new Test);
18+
?>
19+
--EXPECT--
20+
object(Test)#2 (0) {
21+
}

0 commit comments

Comments
 (0)