Skip to content

Commit 08cbb99

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fix inc/dec of undef var with error handler
2 parents 58a0c5a + 22b6aac commit 08cbb99

File tree

5 files changed

+39
-14
lines changed

5 files changed

+39
-14
lines changed

Zend/tests/incdec_undef.phpt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
Inc/dec undef var with error handler
3+
--FILE--
4+
<?php
5+
set_error_handler(function($_, $m) {
6+
echo "$m\n";
7+
unset($GLOBALS['x']);
8+
});
9+
var_dump($x--);
10+
unset($x);
11+
var_dump($x++);
12+
unset($x);
13+
var_dump(--$x);
14+
unset($x);
15+
var_dump(++$x);
16+
?>
17+
--EXPECT--
18+
Undefined variable $x
19+
NULL
20+
Undefined variable $x
21+
NULL
22+
Undefined variable $x
23+
NULL
24+
Undefined variable $x
25+
int(1)

Zend/zend_vm_def.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,8 +1470,8 @@ ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY)
14701470

14711471
SAVE_OPLINE();
14721472
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1473-
ZVAL_NULL(var_ptr);
14741473
ZVAL_UNDEFINED_OP1();
1474+
ZVAL_NULL(var_ptr);
14751475
}
14761476

14771477
do {
@@ -1521,8 +1521,8 @@ ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY)
15211521

15221522
SAVE_OPLINE();
15231523
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1524-
ZVAL_NULL(var_ptr);
15251524
ZVAL_UNDEFINED_OP1();
1525+
ZVAL_NULL(var_ptr);
15261526
}
15271527

15281528
do {
@@ -1573,8 +1573,8 @@ ZEND_VM_HELPER(zend_post_inc_helper, VAR|CV, ANY)
15731573

15741574
SAVE_OPLINE();
15751575
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1576-
ZVAL_NULL(var_ptr);
15771576
ZVAL_UNDEFINED_OP1();
1577+
ZVAL_NULL(var_ptr);
15781578
}
15791579

15801580
do {
@@ -1621,8 +1621,8 @@ ZEND_VM_HELPER(zend_post_dec_helper, VAR|CV, ANY)
16211621

16221622
SAVE_OPLINE();
16231623
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
1624-
ZVAL_NULL(var_ptr);
16251624
ZVAL_UNDEFINED_OP1();
1625+
ZVAL_NULL(var_ptr);
16261626
}
16271627

16281628
do {

Zend/zend_vm_execute.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21210,8 +21210,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_inc_help
2121021210

2121121211
SAVE_OPLINE();
2121221212
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
21213-
ZVAL_NULL(var_ptr);
2121421213
ZVAL_UNDEFINED_OP1();
21214+
ZVAL_NULL(var_ptr);
2121521215
}
2121621216

2121721217
do {
@@ -21279,8 +21279,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_dec_help
2127921279

2128021280
SAVE_OPLINE();
2128121281
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
21282-
ZVAL_NULL(var_ptr);
2128321282
ZVAL_UNDEFINED_OP1();
21283+
ZVAL_NULL(var_ptr);
2128421284
}
2128521285

2128621286
do {
@@ -21349,8 +21349,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_inc_hel
2134921349

2135021350
SAVE_OPLINE();
2135121351
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
21352-
ZVAL_NULL(var_ptr);
2135321352
ZVAL_UNDEFINED_OP1();
21353+
ZVAL_NULL(var_ptr);
2135421354
}
2135521355

2135621356
do {
@@ -21397,8 +21397,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_dec_hel
2139721397

2139821398
SAVE_OPLINE();
2139921399
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
21400-
ZVAL_NULL(var_ptr);
2140121400
ZVAL_UNDEFINED_OP1();
21401+
ZVAL_NULL(var_ptr);
2140221402
}
2140321403

2140421404
do {
@@ -37303,8 +37303,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_inc_help
3730337303

3730437304
SAVE_OPLINE();
3730537305
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
37306-
ZVAL_NULL(var_ptr);
3730737306
ZVAL_UNDEFINED_OP1();
37307+
ZVAL_NULL(var_ptr);
3730837308
}
3730937309

3731037310
do {
@@ -37371,8 +37371,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_dec_help
3737137371

3737237372
SAVE_OPLINE();
3737337373
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
37374-
ZVAL_NULL(var_ptr);
3737537374
ZVAL_UNDEFINED_OP1();
37375+
ZVAL_NULL(var_ptr);
3737637376
}
3737737377

3737837378
do {
@@ -37440,8 +37440,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_inc_hel
3744037440

3744137441
SAVE_OPLINE();
3744237442
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
37443-
ZVAL_NULL(var_ptr);
3744437443
ZVAL_UNDEFINED_OP1();
37444+
ZVAL_NULL(var_ptr);
3744537445
}
3744637446

3744737447
do {
@@ -37487,8 +37487,8 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_dec_hel
3748737487

3748837488
SAVE_OPLINE();
3748937489
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
37490-
ZVAL_NULL(var_ptr);
3749137490
ZVAL_UNDEFINED_OP1();
37491+
ZVAL_NULL(var_ptr);
3749237492
}
3749337493

3749437494
do {

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3757,8 +3757,8 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
37573757
| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >2, ZREG_TMP1
37583758
| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
37593759
| LOAD_32BIT_VAL FCARG1w, opline->op1.var
3760-
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL, TMP1w, TMP2
37613760
| EXT_CALL zend_jit_undefined_op_helper, REG0
3761+
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL, TMP1w, TMP2
37623762
op1_info |= MAY_BE_NULL;
37633763
}
37643764
|2:

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4125,8 +4125,8 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
41254125
| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >2
41264126
| // zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
41274127
| mov FCARG1d, opline->op1.var
4128-
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL
41294128
| EXT_CALL zend_jit_undefined_op_helper, r0
4129+
| SET_ZVAL_TYPE_INFO op1_addr, IS_NULL
41304130
op1_info |= MAY_BE_NULL;
41314131
}
41324132
|2:

0 commit comments

Comments
 (0)