Skip to content

Commit 939b91a

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: JIT: Fixed incorrect assignment of undefined variable
2 parents bda1ee9 + 01cfd5e commit 939b91a

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5567,7 +5567,12 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
55675567
if (Z_REG(var_addr) != ZREG_FP) {
55685568
| ldr Rx(Z_REG(var_addr)), T1 // restore
55695569
}
5570-
| b >1
5570+
if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1 || Z_OFFSET(var_addr) != 0) {
5571+
| LOAD_ZVAL_ADDR FCARG1x, var_addr
5572+
}
5573+
| LOAD_ADDR_ZTS FCARG2x, executor_globals, uninitialized_zval
5574+
| bl ->assign_const
5575+
| b >9
55715576
|.code
55725577
|1:
55735578
}
@@ -5599,6 +5604,9 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
55995604
} else {
56005605
| bl ->assign_cv
56015606
}
5607+
if ((val_info & MAY_BE_UNDEF) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
5608+
|9:
5609+
}
56025610
} else {
56035611
ZEND_UNREACHABLE();
56045612
}

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6042,9 +6042,13 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
60426042
if (Z_REG(var_addr) != ZREG_FP) {
60436043
| mov Ra(Z_REG(var_addr)), aword T1 // restore
60446044
}
6045-
| jmp >1
6045+
if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1 || Z_OFFSET(var_addr) != 0) {
6046+
| LOAD_ZVAL_ADDR FCARG1a, var_addr
6047+
}
6048+
| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval
6049+
| call ->assign_const
6050+
| jmp >9
60466051
|.code
6047-
|1:
60486052
}
60496053
}
60506054
if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1 || Z_OFFSET(var_addr) != 0) {
@@ -6074,6 +6078,9 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
60746078
} else {
60756079
| call ->assign_cv
60766080
}
6081+
if ((val_info & MAY_BE_UNDEF) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
6082+
|9:
6083+
}
60776084
} else {
60786085
ZEND_UNREACHABLE();
60796086
}

ext/opcache/tests/jit/assign_obj_002.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ class Test {
1414
function test() {
1515
$o = new Test;
1616
$o->prop = $undef;
17+
var_dump($o->prop);
1718
}
1819
test();
1920
?>
2021
DONE
2122
--EXPECTF--
2223
Warning: Undefined variable $undef in %sassign_obj_002.php on line 7
24+
NULL
2325
DONE

0 commit comments

Comments
 (0)