Skip to content

Commit 8bf663d

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fix $x = (bool)$x; for undefined with opcache
2 parents f826bbd + be6fb13 commit 8bf663d

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

Zend/zend_vm_def.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -940,8 +940,10 @@ ZEND_VM_COLD_CONST_HANDLER(14, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
940940
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
941941
ZVAL_FALSE(EX_VAR(opline->result.var));
942942
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
943+
/* The result and op1 can be the same cv zval */
944+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
943945
ZVAL_TRUE(EX_VAR(opline->result.var));
944-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
946+
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
945947
SAVE_OPLINE();
946948
ZVAL_UNDEFINED_OP1();
947949
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5121,8 +5123,10 @@ ZEND_VM_COLD_CONST_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
51215123
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
51225124
ZVAL_TRUE(EX_VAR(opline->result.var));
51235125
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
5126+
/* The result and op1 can be the same cv zval */
5127+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
51245128
ZVAL_FALSE(EX_VAR(opline->result.var));
5125-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
5129+
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
51265130
SAVE_OPLINE();
51275131
ZVAL_UNDEFINED_OP1();
51285132
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

Zend/zend_vm_execute.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3184,8 +3184,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CON
31843184
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
31853185
ZVAL_FALSE(EX_VAR(opline->result.var));
31863186
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3187+
/* The result and op1 can be the same cv zval */
3188+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
31873189
ZVAL_TRUE(EX_VAR(opline->result.var));
3188-
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3190+
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
31893191
SAVE_OPLINE();
31903192
ZVAL_UNDEFINED_OP1();
31913193
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -3753,8 +3755,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_H
37533755
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
37543756
ZVAL_TRUE(EX_VAR(opline->result.var));
37553757
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3758+
/* The result and op1 can be the same cv zval */
3759+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
37563760
ZVAL_FALSE(EX_VAR(opline->result.var));
3757-
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3761+
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
37583762
SAVE_OPLINE();
37593763
ZVAL_UNDEFINED_OP1();
37603764
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -12644,8 +12648,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(Z
1264412648
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
1264512649
ZVAL_FALSE(EX_VAR(opline->result.var));
1264612650
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
12651+
/* The result and op1 can be the same cv zval */
12652+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
1264712653
ZVAL_TRUE(EX_VAR(opline->result.var));
12648-
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
12654+
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
1264912655
SAVE_OPLINE();
1265012656
ZVAL_UNDEFINED_OP1();
1265112657
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -12946,8 +12952,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_
1294612952
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
1294712953
ZVAL_TRUE(EX_VAR(opline->result.var));
1294812954
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
12955+
/* The result and op1 can be the same cv zval */
12956+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
1294912957
ZVAL_FALSE(EX_VAR(opline->result.var));
12950-
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
12958+
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
1295112959
SAVE_OPLINE();
1295212960
ZVAL_UNDEFINED_OP1();
1295312961
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -34897,8 +34905,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_
3489734905
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3489834906
ZVAL_FALSE(EX_VAR(opline->result.var));
3489934907
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
34908+
/* The result and op1 can be the same cv zval */
34909+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
3490034910
ZVAL_TRUE(EX_VAR(opline->result.var));
34901-
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
34911+
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
3490234912
SAVE_OPLINE();
3490334913
ZVAL_UNDEFINED_OP1();
3490434914
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -35733,8 +35743,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCO
3573335743
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3573435744
ZVAL_TRUE(EX_VAR(opline->result.var));
3573535745
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
35746+
/* The result and op1 can be the same cv zval */
35747+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
3573635748
ZVAL_FALSE(EX_VAR(opline->result.var));
35737-
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
35749+
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
3573835750
SAVE_OPLINE();
3573935751
ZVAL_UNDEFINED_OP1();
3574035752
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

ext/opcache/tests/bool_not_cv.phpt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
--TEST--
2+
$v = !$v/(bool)$v checks for undefined variables
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_cache_only=0
7+
--SKIPIF--
8+
<?php require_once('skipif.inc'); ?>
9+
--FILE--
10+
<?php
11+
function undef_negation() {
12+
echo "In undef_negation\n";
13+
$v = !$v;
14+
var_export($v);
15+
echo "\n";
16+
}
17+
function undef_bool_cast() {
18+
echo "In undef_bool_cast\n";
19+
$v = (bool)$v;
20+
var_export($v);
21+
echo "\n";
22+
}
23+
undef_negation();
24+
undef_bool_cast();
25+
?>
26+
--EXPECTF--
27+
In undef_negation
28+
29+
Warning: Undefined variable: v in %s on line 4
30+
true
31+
In undef_bool_cast
32+
33+
Warning: Undefined variable: v in %s on line 10
34+
false

0 commit comments

Comments
 (0)