Skip to content

Commit 88196e9

Browse files
committed
Added specialized handler for ZEND_FETCH_DIM_R opcode with only numeric indexes.
1 parent 932c952 commit 88196e9

File tree

2 files changed

+515
-5
lines changed

2 files changed

+515
-5
lines changed

Zend/zend_vm_def.h

+48
Original file line numberDiff line numberDiff line change
@@ -8463,4 +8463,52 @@ ZEND_VM_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDE
84638463
ZEND_VM_NEXT_OPCODE();
84648464
}
84658465

8466+
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_FETCH_DIM_R, (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))), ZEND_FETCH_DIM_R_INDEX, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
8467+
{
8468+
USE_OPLINE
8469+
zend_free_op free_op1, free_op2;
8470+
zval *container, *dim, *value;
8471+
zend_long offset;
8472+
8473+
container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
8474+
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
8475+
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
8476+
ZEND_VM_C_LABEL(fetch_dim_r_index_array):
8477+
if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
8478+
offset = Z_LVAL_P(dim);
8479+
} else {
8480+
offset = zval_get_long(dim);
8481+
}
8482+
ZEND_HASH_INDEX_FIND(Z_ARRVAL_P(container), offset, value, ZEND_VM_C_LABEL(fetch_dim_r_index_undef));
8483+
ZVAL_COPY(EX_VAR(opline->result.var), value);
8484+
if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
8485+
SAVE_OPLINE();
8486+
FREE_OP1();
8487+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
8488+
} else {
8489+
ZEND_VM_NEXT_OPCODE();
8490+
}
8491+
} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
8492+
container = Z_REFVAL_P(container);
8493+
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
8494+
ZEND_VM_C_GOTO(fetch_dim_r_index_array);
8495+
} else {
8496+
ZEND_VM_C_GOTO(fetch_dim_r_index_slow);
8497+
}
8498+
} else {
8499+
ZEND_VM_C_LABEL(fetch_dim_r_index_slow):
8500+
SAVE_OPLINE();
8501+
zend_fetch_dimension_address_read_R_slow(EX_VAR(opline->result.var), container, dim);
8502+
FREE_OP1();
8503+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
8504+
}
8505+
8506+
ZEND_VM_C_LABEL(fetch_dim_r_index_undef):
8507+
ZVAL_NULL(EX_VAR(opline->result.var));
8508+
SAVE_OPLINE();
8509+
zend_error(E_NOTICE, "Undefined offset: " ZEND_LONG_FMT, offset);
8510+
FREE_OP1();
8511+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
8512+
}
8513+
84668514
ZEND_VM_DEFINE_OP(137, ZEND_OP_DATA);

0 commit comments

Comments
 (0)