Skip to content

Commit 1d4c384

Browse files
committed
Delay IS_UNDEF checks
1 parent 2e26b06 commit 1d4c384

File tree

3 files changed

+190
-24
lines changed

3 files changed

+190
-24
lines changed

Zend/zend_execute.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2739,6 +2739,12 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
27392739
break;
27402740
}
27412741

2742+
if (container_op_type == IS_CV
2743+
&& type != BP_VAR_W
2744+
&& UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
2745+
container = ZVAL_UNDEFINED_OP1();
2746+
}
2747+
27422748
/* this should modify object only if it's empty */
27432749
if (type == BP_VAR_UNSET) {
27442750
return;

Zend/zend_vm_def.h

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,7 +1078,7 @@ ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, OP)
10781078
zend_property_info *prop_info;
10791079

10801080
SAVE_OPLINE();
1081-
object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
1081+
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
10821082

10831083
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
10841084
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -1094,6 +1094,10 @@ ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, OP)
10941094
object = Z_REFVAL_P(object);
10951095
ZEND_VM_C_GOTO(assign_op_object);
10961096
}
1097+
if (OP1_TYPE == IS_CV
1098+
&& UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
1099+
object = ZVAL_UNDEFINED_OP1();
1100+
}
10971101
object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
10981102
if (UNEXPECTED(!object)) {
10991103
break;
@@ -1349,7 +1353,7 @@ ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACH
13491353
zend_property_info *prop_info;
13501354

13511355
SAVE_OPLINE();
1352-
object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
1356+
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
13531357

13541358
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
13551359
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -1363,6 +1367,10 @@ ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACH
13631367
object = Z_REFVAL_P(object);
13641368
ZEND_VM_C_GOTO(pre_incdec_object);
13651369
}
1370+
if (OP1_TYPE == IS_CV
1371+
&& UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
1372+
object = ZVAL_UNDEFINED_OP1();
1373+
}
13661374
object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
13671375
if (UNEXPECTED(!object)) {
13681376
break;
@@ -1411,7 +1419,7 @@ ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC
14111419
zend_property_info *prop_info;
14121420

14131421
SAVE_OPLINE();
1414-
object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
1422+
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
14151423

14161424
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
14171425
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -1425,6 +1433,10 @@ ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC
14251433
object = Z_REFVAL_P(object);
14261434
ZEND_VM_C_GOTO(post_incdec_object);
14271435
}
1436+
if (OP1_TYPE == IS_CV
1437+
&& UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
1438+
object = ZVAL_UNDEFINED_OP1();
1439+
}
14281440
object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
14291441
if (UNEXPECTED(!object)) {
14301442
break;
@@ -2200,7 +2212,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACH
22002212
zval *property, *container, *result;
22012213

22022214
SAVE_OPLINE();
2203-
container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
2215+
container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
22042216

22052217
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
22062218
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -2339,7 +2351,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C
23392351
zval *container, *property, *result;
23402352

23412353
SAVE_OPLINE();
2342-
container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
2354+
container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
23432355

23442356
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
23452357
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -6185,7 +6197,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_S
61856197
zval *offset;
61866198

61876199
SAVE_OPLINE();
6188-
container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
6200+
container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
61896201
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
61906202
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
61916203
}
@@ -6196,6 +6208,10 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_S
61966208
if (Z_ISREF_P(container)) {
61976209
container = Z_REFVAL_P(container);
61986210
if (Z_TYPE_P(container) != IS_OBJECT) {
6211+
if (OP1_TYPE == IS_CV
6212+
&& UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
6213+
container = ZVAL_UNDEFINED_OP1();
6214+
}
61996215
break;
62006216
}
62016217
} else {

0 commit comments

Comments
 (0)