Skip to content

Commit 798c58a

Browse files
committed
Avoid unnecessary SAVE_OPLINE and CHECK_EXCEPTION
1 parent 77eebed commit 798c58a

File tree

2 files changed

+49
-16
lines changed

2 files changed

+49
-16
lines changed

Zend/zend_vm_def.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10268,7 +10268,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, ((op->op1_type == IS_CONST) ? !Z_R
1026810268
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FETCH_DIM_R, (op->op1_type != IS_CONST && op->op2_type == IS_CONST && !(op2_info & (MAY_BE_ANY-MAY_BE_STRING-MAY_BE_LONG))), ZEND_FETCH_DIM_R_CACHED_INDEX, TMPVAR|CV, CONST, CACHE_SLOT)
1026910269
{
1027010270
USE_OPLINE
10271-
SAVE_OPLINE();
1027210271

1027310272
zval *container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
1027410273
zval *dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -10282,15 +10281,22 @@ ZEND_VM_C_LABEL(fetch_dim_r_const_index_array):
1028210281
zval *value = &ht->arPacked[offset];
1028310282
if (EXPECTED(Z_TYPE_P(value) != IS_UNDEF)) {
1028410283
ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
10285-
FREE_OP1();
10286-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
10284+
if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
10285+
SAVE_OPLINE();
10286+
FREE_OP1();
10287+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
10288+
} else {
10289+
ZEND_VM_NEXT_OPCODE();
10290+
}
1028710291
}
1028810292
}
10293+
SAVE_OPLINE();
1028910294
zend_undefined_offset(offset);
1029010295
ZEND_VM_C_GOTO(fetch_dim_r_cached_index_undef);
1029110296
}
1029210297
} else {
10293-
if (HT_IS_PACKED(ht)) {
10298+
if (UNEXPECTED(HT_IS_PACKED(ht))) {
10299+
SAVE_OPLINE();
1029410300
zend_undefined_index(Z_STR_P(dim));
1029510301
ZEND_VM_C_GOTO(fetch_dim_r_cached_index_undef);
1029610302
}
@@ -10301,11 +10307,16 @@ ZEND_VM_C_LABEL(fetch_dim_r_const_index_array):
1030110307
Bucket *b = &ht->arData[cached_offset - 1];
1030210308
if (!b->key ? (Z_TYPE_P(dim) == IS_LONG && b->h == Z_LVAL_P(dim)) : (Z_TYPE_P(dim) == IS_STRING && zend_string_equals(b->key, Z_STR_P(dim)))) {
1030310309
ZVAL_COPY_DEREF(EX_VAR(opline->result.var), &b->val);
10304-
FREE_OP1();
10305-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
10310+
if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
10311+
FREE_OP1();
10312+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
10313+
} else {
10314+
ZEND_VM_NEXT_OPCODE();
10315+
}
1030610316
}
1030710317
}
1030810318

10319+
SAVE_OPLINE();
1030910320
zend_fetch_dimension_address_read_R_ex(container, dim, OP2_TYPE, CACHE_ADDR(opline->extended_value) OPLINE_CC EXECUTE_DATA_CC);
1031010321
FREE_OP1();
1031110322
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

Zend/zend_vm_execute.h

Lines changed: 32 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)