Skip to content

Commit e72e337

Browse files
committed
Merge branch 'PHP-7.2' into PHP-7.3
* PHP-7.2: Fix $x = (bool)$x; for undefined with opcache
2 parents 39d04f1 + a2c41c0 commit e72e337

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
@@ -741,8 +741,10 @@ ZEND_VM_COLD_CONST_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
741741
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
742742
ZVAL_FALSE(EX_VAR(opline->result.var));
743743
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
744+
/* The result and op1 can be the same cv zval */
745+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
744746
ZVAL_TRUE(EX_VAR(opline->result.var));
745-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
747+
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
746748
SAVE_OPLINE();
747749
GET_OP1_UNDEF_CV(val, BP_VAR_R);
748750
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -4846,8 +4848,10 @@ ZEND_VM_COLD_CONST_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
48464848
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
48474849
ZVAL_TRUE(EX_VAR(opline->result.var));
48484850
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
4851+
/* The result and op1 can be the same cv zval */
4852+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
48494853
ZVAL_FALSE(EX_VAR(opline->result.var));
4850-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
4854+
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
48514855
SAVE_OPLINE();
48524856
GET_OP1_UNDEF_CV(val, BP_VAR_R);
48534857
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
@@ -2485,8 +2485,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CON
24852485
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
24862486
ZVAL_FALSE(EX_VAR(opline->result.var));
24872487
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
2488+
/* The result and op1 can be the same cv zval */
2489+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
24882490
ZVAL_TRUE(EX_VAR(opline->result.var));
2489-
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
2491+
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
24902492
SAVE_OPLINE();
24912493
GET_OP1_UNDEF_CV(val, BP_VAR_R);
24922494
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -3056,8 +3058,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_H
30563058
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
30573059
ZVAL_TRUE(EX_VAR(opline->result.var));
30583060
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3061+
/* The result and op1 can be the same cv zval */
3062+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
30593063
ZVAL_FALSE(EX_VAR(opline->result.var));
3060-
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3064+
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
30613065
SAVE_OPLINE();
30623066
GET_OP1_UNDEF_CV(val, BP_VAR_R);
30633067
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -12101,8 +12105,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(Z
1210112105
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
1210212106
ZVAL_FALSE(EX_VAR(opline->result.var));
1210312107
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
12108+
/* The result and op1 can be the same cv zval */
12109+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
1210412110
ZVAL_TRUE(EX_VAR(opline->result.var));
12105-
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
12111+
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
1210612112
SAVE_OPLINE();
1210712113
GET_OP1_UNDEF_CV(val, BP_VAR_R);
1210812114
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -12363,8 +12369,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_
1236312369
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
1236412370
ZVAL_TRUE(EX_VAR(opline->result.var));
1236512371
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
12372+
/* The result and op1 can be the same cv zval */
12373+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
1236612374
ZVAL_FALSE(EX_VAR(opline->result.var));
12367-
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
12375+
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
1236812376
SAVE_OPLINE();
1236912377
GET_OP1_UNDEF_CV(val, BP_VAR_R);
1237012378
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -36411,8 +36419,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_
3641136419
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3641236420
ZVAL_FALSE(EX_VAR(opline->result.var));
3641336421
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
36422+
/* The result and op1 can be the same cv zval */
36423+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
3641436424
ZVAL_TRUE(EX_VAR(opline->result.var));
36415-
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
36425+
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
3641636426
SAVE_OPLINE();
3641736427
GET_OP1_UNDEF_CV(val, BP_VAR_R);
3641836428
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -37234,8 +37244,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCO
3723437244
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3723537245
ZVAL_TRUE(EX_VAR(opline->result.var));
3723637246
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
37247+
/* The result and op1 can be the same cv zval */
37248+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
3723737249
ZVAL_FALSE(EX_VAR(opline->result.var));
37238-
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
37250+
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
3723937251
SAVE_OPLINE();
3724037252
GET_OP1_UNDEF_CV(val, BP_VAR_R);
3724137253
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+
Notice: Undefined variable: v in %s on line 4
30+
true
31+
In undef_bool_cast
32+
33+
Notice: Undefined variable: v in %s on line 10
34+
false

0 commit comments

Comments
 (0)