Skip to content

Commit 01cfd5e

Browse files
committed
JIT: Fixed incorrect assignment of undefined variable
1 parent a49a309 commit 01cfd5e

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6040,9 +6040,13 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
60406040
if (Z_REG(var_addr) != ZREG_FP) {
60416041
| mov Ra(Z_REG(var_addr)), aword T1 // restore
60426042
}
6043-
| jmp >1
6043+
if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1a || Z_OFFSET(var_addr) != 0) {
6044+
| LOAD_ZVAL_ADDR FCARG1a, var_addr
6045+
}
6046+
| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval
6047+
| call ->assign_const
6048+
| jmp >9
60446049
|.code
6045-
|1:
60466050
}
60476051
}
60486052
if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1a || Z_OFFSET(var_addr) != 0) {
@@ -6072,6 +6076,9 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
60726076
} else {
60736077
| call ->assign_cv
60746078
}
6079+
if ((val_info & MAY_BE_UNDEF) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
6080+
|9:
6081+
}
60756082
} else {
60766083
ZEND_UNREACHABLE();
60776084
}

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)