Skip to content

Commit f81ed70

Browse files
committed
Make nullsafe op on undef variable consistent
with undefined variable behavior in the language.
1 parent 00dad58 commit f81ed70

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

Zend/tests/nullsafe_operator/018.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Test nullsafe on undefined variable
3+
--FILE--
4+
<?php
5+
6+
var_dump($foo?->bar = 10);
7+
var_dump($foo?->bar());
8+
var_dump($foo);
9+
10+
?>
11+
--EXPECTF--
12+
Warning: Undefined variable $foo in %s.php on line 3
13+
NULL
14+
15+
Warning: Undefined variable $foo in %s.php on line 4
16+
NULL
17+
18+
Warning: Undefined variable $foo in %s.php on line 5
19+
NULL

Zend/zend_vm_def.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7037,12 +7037,20 @@ ZEND_VM_HOT_NOCONST_HANDLER(195, ZEND_JMP_NULL, CONST|TMPVAR|CV, JMP_ADDR)
70377037

70387038
val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
70397039

7040-
if (Z_TYPE_INFO_P(val) != IS_NULL) {
7040+
if (Z_TYPE_INFO_P(val) > IS_NULL) {
70417041
ZEND_VM_NEXT_OPCODE();
70427042
} else {
70437043
zval *result = EX_VAR(opline->result.var);
70447044

70457045
if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
7046+
if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
7047+
SAVE_OPLINE();
7048+
ZVAL_UNDEFINED_OP1();
7049+
if (UNEXPECTED(EG(exception) != NULL)) {
7050+
HANDLE_EXCEPTION();
7051+
}
7052+
}
7053+
70467054
ZVAL_NULL(result);
70477055
} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
70487056
ZVAL_BOOL(result, 0);

Zend/zend_vm_execute.h

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4290,12 +4290,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_NULL_SPEC_CON
42904290

42914291
val = RT_CONSTANT(opline, opline->op1);
42924292

4293-
if (Z_TYPE_INFO_P(val) != IS_NULL) {
4293+
if (Z_TYPE_INFO_P(val) > IS_NULL) {
42944294
ZEND_VM_NEXT_OPCODE();
42954295
} else {
42964296
zval *result = EX_VAR(opline->result.var);
42974297

42984298
if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
4299+
if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
4300+
SAVE_OPLINE();
4301+
ZVAL_UNDEFINED_OP1();
4302+
if (UNEXPECTED(EG(exception) != NULL)) {
4303+
HANDLE_EXCEPTION();
4304+
}
4305+
}
4306+
42994307
ZVAL_NULL(result);
43004308
} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
43014309
ZVAL_BOOL(result, 0);
@@ -13201,12 +13209,20 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_NULL_SPEC_TMPV
1320113209

1320213210
val = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
1320313211

13204-
if (Z_TYPE_INFO_P(val) != IS_NULL) {
13212+
if (Z_TYPE_INFO_P(val) > IS_NULL) {
1320513213
ZEND_VM_NEXT_OPCODE();
1320613214
} else {
1320713215
zval *result = EX_VAR(opline->result.var);
1320813216

1320913217
if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
13218+
if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
13219+
SAVE_OPLINE();
13220+
ZVAL_UNDEFINED_OP1();
13221+
if (UNEXPECTED(EG(exception) != NULL)) {
13222+
HANDLE_EXCEPTION();
13223+
}
13224+
}
13225+
1321013226
ZVAL_NULL(result);
1321113227
} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
1321213228
ZVAL_BOOL(result, 0);
@@ -36586,12 +36602,20 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_NULL_SPEC_CV_H
3658636602

3658736603
val = EX_VAR(opline->op1.var);
3658836604

36589-
if (Z_TYPE_INFO_P(val) != IS_NULL) {
36605+
if (Z_TYPE_INFO_P(val) > IS_NULL) {
3659036606
ZEND_VM_NEXT_OPCODE();
3659136607
} else {
3659236608
zval *result = EX_VAR(opline->result.var);
3659336609

3659436610
if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
36611+
if (UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
36612+
SAVE_OPLINE();
36613+
ZVAL_UNDEFINED_OP1();
36614+
if (UNEXPECTED(EG(exception) != NULL)) {
36615+
HANDLE_EXCEPTION();
36616+
}
36617+
}
36618+
3659536619
ZVAL_NULL(result);
3659636620
} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
3659736621
ZVAL_BOOL(result, 0);

0 commit comments

Comments
 (0)