Skip to content

Commit f58c645

Browse files
committed
Eliminate exception checks
1 parent 52a0630 commit f58c645

File tree

2 files changed

+442
-78
lines changed

2 files changed

+442
-78
lines changed

Zend/zend_vm_def.h

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1989,7 +1989,13 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
19891989
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
19901990
retval = OBJ_PROP(zobj, prop_offset);
19911991
if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
1992-
ZEND_VM_C_GOTO(fetch_obj_r_copy);
1992+
if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR))) {
1993+
ZEND_VM_C_GOTO(fetch_obj_r_copy);
1994+
} else {
1995+
ZEND_VM_C_LABEL(fetch_obj_r_fast_copy):
1996+
ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
1997+
ZEND_VM_NEXT_OPCODE();
1998+
}
19931999
}
19942000
} else if (EXPECTED(zobj->properties != NULL)) {
19952001
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -2004,7 +2010,11 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
20042010
EXPECTED(p->key != NULL) &&
20052011
EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
20062012
retval = &p->val;
2007-
ZEND_VM_C_GOTO(fetch_obj_r_copy);
2013+
if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR))) {
2014+
ZEND_VM_C_GOTO(fetch_obj_r_copy);
2015+
} else {
2016+
ZEND_VM_C_GOTO(fetch_obj_r_fast_copy);
2017+
}
20082018
}
20092019
}
20102020
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -2013,7 +2023,11 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
20132023
if (EXPECTED(retval)) {
20142024
uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
20152025
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
2016-
ZEND_VM_C_GOTO(fetch_obj_r_copy);
2026+
if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR))) {
2027+
ZEND_VM_C_GOTO(fetch_obj_r_copy);
2028+
} else {
2029+
ZEND_VM_C_GOTO(fetch_obj_r_fast_copy);
2030+
}
20172031
}
20182032
}
20192033
}
@@ -2131,7 +2145,13 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
21312145
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
21322146
retval = OBJ_PROP(zobj, prop_offset);
21332147
if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
2134-
ZEND_VM_C_GOTO(fetch_obj_is_copy);
2148+
if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR))) {
2149+
ZEND_VM_C_GOTO(fetch_obj_is_copy);
2150+
} else {
2151+
ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
2152+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
2153+
ZEND_VM_NEXT_OPCODE();
2154+
}
21352155
}
21362156
} else if (EXPECTED(zobj->properties != NULL)) {
21372157
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -2146,7 +2166,11 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
21462166
EXPECTED(p->key != NULL) &&
21472167
EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) {
21482168
retval = &p->val;
2149-
ZEND_VM_C_GOTO(fetch_obj_is_copy);
2169+
if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR))) {
2170+
ZEND_VM_C_GOTO(fetch_obj_is_copy);
2171+
} else {
2172+
ZEND_VM_C_GOTO(fetch_obj_is_fast_copy);
2173+
}
21502174
}
21512175
}
21522176
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -2155,7 +2179,11 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
21552179
if (EXPECTED(retval)) {
21562180
uintptr_t idx = (char*)retval - (char*)zobj->properties->arData;
21572181
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
2158-
ZEND_VM_C_GOTO(fetch_obj_is_copy);
2182+
if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR))) {
2183+
ZEND_VM_C_GOTO(fetch_obj_is_copy);
2184+
} else {
2185+
ZEND_VM_C_GOTO(fetch_obj_is_fast_copy);
2186+
}
21592187
}
21602188
}
21612189
}

0 commit comments

Comments
 (0)