Skip to content

Commit 1b94b5b

Browse files
committed
Avoid reading of property name in FETCH_OBJ_R/IS if it can be accessed through run-time cache slot.
1 parent bd9f4fa commit 1b94b5b

File tree

2 files changed

+130
-195
lines changed

2 files changed

+130
-195
lines changed

Zend/zend_vm_def.h

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,12 +2008,10 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
20082008
{
20092009
USE_OPLINE
20102010
zval *container;
2011-
zval *offset;
20122011
void **cache_slot = NULL;
20132012

20142013
SAVE_OPLINE();
20152014
container = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
2016-
offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
20172015

20182016
if (OP1_TYPE == IS_CONST ||
20192017
(OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
@@ -2027,10 +2025,7 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
20272025
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
20282026
ZVAL_UNDEFINED_OP1();
20292027
}
2030-
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
2031-
ZVAL_UNDEFINED_OP2();
2032-
}
2033-
zend_wrong_property_read(container, offset);
2028+
zend_wrong_property_read(container, GET_OP2_ZVAL_PTR(BP_VAR_R));
20342029
ZVAL_NULL(EX_VAR(opline->result.var));
20352030
ZEND_VM_C_GOTO(fetch_obj_r_finish);
20362031
} while (0);
@@ -2043,7 +2038,6 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
20432038
zval *retval;
20442039

20452040
if (OP2_TYPE == IS_CONST) {
2046-
name = Z_STR_P(offset);
20472041
cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
20482042

20492043
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
@@ -2061,6 +2055,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_fast_copy):
20612055
}
20622056
}
20632057
} else if (EXPECTED(zobj->properties != NULL)) {
2058+
name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
20642059
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
20652060
uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
20662061

@@ -2094,11 +2089,9 @@ ZEND_VM_C_LABEL(fetch_obj_r_fast_copy):
20942089
}
20952090
}
20962091
}
2092+
name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
20972093
} else {
2098-
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
2099-
ZVAL_UNDEFINED_OP2();
2100-
}
2101-
name = zval_try_get_tmp_string(offset, &tmp_name);
2094+
name = zval_try_get_tmp_string(GET_OP2_ZVAL_PTR(BP_VAR_R), &tmp_name);
21022095
if (UNEXPECTED(!name)) {
21032096
ZVAL_UNDEF(EX_VAR(opline->result.var));
21042097
break;
@@ -2172,12 +2165,10 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
21722165
{
21732166
USE_OPLINE
21742167
zval *container;
2175-
zval *offset;
21762168
void **cache_slot = NULL;
21772169

21782170
SAVE_OPLINE();
21792171
container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
2180-
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
21812172

21822173
if (OP1_TYPE == IS_CONST ||
21832174
(OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
@@ -2188,6 +2179,9 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
21882179
break;
21892180
}
21902181
}
2182+
if (OP2_TYPE == IS_CV && Z_TYPE_P(EX_VAR(opline->op2.var)) == IS_UNDEF) {
2183+
ZVAL_UNDEFINED_OP2();
2184+
}
21912185
ZVAL_NULL(EX_VAR(opline->result.var));
21922186
ZEND_VM_C_GOTO(fetch_obj_is_finish);
21932187
} while (0);
@@ -2200,7 +2194,6 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
22002194
zval *retval;
22012195

22022196
if (OP2_TYPE == IS_CONST) {
2203-
name = Z_STR_P(offset);
22042197
cache_slot = CACHE_ADDR(opline->extended_value);
22052198

22062199
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
@@ -2218,6 +2211,7 @@ ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
22182211
}
22192212
}
22202213
} else if (EXPECTED(zobj->properties != NULL)) {
2214+
name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
22212215
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
22222216
uintptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
22232217

@@ -2251,8 +2245,9 @@ ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
22512245
}
22522246
}
22532247
}
2248+
name = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
22542249
} else {
2255-
name = zval_try_get_tmp_string(offset, &tmp_name);
2250+
name = zval_try_get_tmp_string(GET_OP2_ZVAL_PTR(BP_VAR_R), &tmp_name);
22562251
if (UNEXPECTED(!name)) {
22572252
ZVAL_UNDEF(EX_VAR(opline->result.var));
22582253
break;

0 commit comments

Comments
 (0)