Skip to content

Commit c466df6

Browse files
committed
Inlined fast paths of the freqently execute handlers for FETCH_DIM_R.
1 parent 0c8879e commit c466df6

File tree

3 files changed

+260
-33
lines changed

3 files changed

+260
-33
lines changed

Zend/zend_execute.c

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1812,19 +1812,21 @@ static zend_never_inline void zend_fetch_dimension_address_UNSET(zval *result, z
18121812
zend_fetch_dimension_address(result, container_ptr, dim, dim_type, BP_VAR_UNSET);
18131813
}
18141814

1815-
static zend_always_inline void zend_fetch_dimension_address_read(zval *result, zval *container, zval *dim, int dim_type, int type, int support_strings)
1815+
static zend_always_inline void zend_fetch_dimension_address_read(zval *result, zval *container, zval *dim, int dim_type, int type, int support_strings, int slow)
18161816
{
18171817
zval *retval;
18181818

1819-
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
1820-
try_array:
1821-
retval = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, dim_type, type);
1822-
ZVAL_COPY(result, retval);
1823-
return;
1824-
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
1825-
container = Z_REFVAL_P(container);
1819+
if (!slow) {
18261820
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
1827-
goto try_array;
1821+
try_array:
1822+
retval = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, dim_type, type);
1823+
ZVAL_COPY(result, retval);
1824+
return;
1825+
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
1826+
container = Z_REFVAL_P(container);
1827+
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
1828+
goto try_array;
1829+
}
18281830
}
18291831
}
18301832
if (support_strings && EXPECTED(Z_TYPE_P(container) == IS_STRING)) {
@@ -1921,17 +1923,22 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
19211923

19221924
static zend_never_inline void zend_fetch_dimension_address_read_R(zval *result, zval *container, zval *dim, int dim_type)
19231925
{
1924-
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 1);
1926+
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 1, 0);
1927+
}
1928+
1929+
static zend_never_inline void zend_fetch_dimension_address_read_R_slow(zval *result, zval *container, zval *dim)
1930+
{
1931+
zend_fetch_dimension_address_read(result, container, dim, IS_CV, BP_VAR_R, 1, 1);
19251932
}
19261933

19271934
static zend_never_inline void zend_fetch_dimension_address_read_IS(zval *result, zval *container, zval *dim, int dim_type)
19281935
{
1929-
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_IS, 1);
1936+
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_IS, 1, 0);
19301937
}
19311938

19321939
static zend_never_inline void zend_fetch_dimension_address_read_LIST(zval *result, zval *container, zval *dim)
19331940
{
1934-
zend_fetch_dimension_address_read(result, container, dim, IS_TMP_VAR, BP_VAR_R, 0);
1941+
zend_fetch_dimension_address_read(result, container, dim, IS_TMP_VAR, BP_VAR_R, 0, 0);
19351942
}
19361943

19371944
ZEND_API void zend_fetch_dimension_by_zval(zval *result, zval *container, zval *dim)
@@ -1941,7 +1948,7 @@ ZEND_API void zend_fetch_dimension_by_zval(zval *result, zval *container, zval *
19411948

19421949
ZEND_API void zend_fetch_dimension_by_zval_is(zval *result, zval *container, zval *dim, int dim_type)
19431950
{
1944-
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_IS, 1);
1951+
zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_IS, 1, 0);
19451952
}
19461953

19471954

Zend/zend_vm_def.h

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,11 +1734,33 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
17341734
{
17351735
USE_OPLINE
17361736
zend_free_op free_op1, free_op2;
1737-
zval *container;
1737+
zval *container, *dim, *value, *result;
17381738

17391739
SAVE_OPLINE();
17401740
container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
1741-
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R), OP2_TYPE);
1741+
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
1742+
if (OP1_TYPE != IS_CONST) {
1743+
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
1744+
ZEND_VM_C_LABEL(fetch_dim_r_array):
1745+
value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, OP2_TYPE, BP_VAR_R);
1746+
result = EX_VAR(opline->result.var);
1747+
ZVAL_COPY(result, value);
1748+
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
1749+
container = Z_REFVAL_P(container);
1750+
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
1751+
ZEND_VM_C_GOTO(fetch_dim_r_array);
1752+
} else {
1753+
ZEND_VM_C_GOTO(fetch_dim_r_slow);
1754+
}
1755+
} else {
1756+
ZEND_VM_C_LABEL(fetch_dim_r_slow):
1757+
result = EX_VAR(opline->result.var);
1758+
zend_fetch_dimension_address_read_R_slow(result, container, dim);
1759+
}
1760+
} else {
1761+
result = EX_VAR(opline->result.var);
1762+
zend_fetch_dimension_address_read_R(result, container, dim, OP2_TYPE);
1763+
}
17421764
FREE_OP2();
17431765
FREE_OP1();
17441766
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

0 commit comments

Comments
 (0)