Skip to content

Commit a417ebf

Browse files
committed
Get rid of duplicare FETCH_DIM_* handlers
1 parent 653bba5 commit a417ebf

File tree

3 files changed

+636
-1151
lines changed

3 files changed

+636
-1151
lines changed

Zend/zend_execute.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,6 +1014,7 @@ static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht
10141014
zend_string *offset_key;
10151015
zend_ulong hval;
10161016

1017+
try_again:
10171018
if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
10181019
hval = Z_LVAL_P(dim);
10191020
num_index:
@@ -1101,6 +1102,9 @@ static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht
11011102
case IS_TRUE:
11021103
hval = 1;
11031104
goto num_index;
1105+
case IS_REFERENCE:
1106+
dim = Z_REFVAL_P(dim);
1107+
goto try_again;
11041108
default:
11051109
zend_error(E_WARNING, "Illegal offset type");
11061110
retval = (type == BP_VAR_W || type == BP_VAR_RW) ?
@@ -1118,6 +1122,7 @@ static zend_never_inline zend_long zend_check_string_offset(zval *container, zva
11181122
zend_error_noreturn(E_ERROR, "[] operator not supported for strings");
11191123
}
11201124

1125+
try_again:
11211126
if (UNEXPECTED(Z_TYPE_P(dim) != IS_LONG)) {
11221127
switch(Z_TYPE_P(dim)) {
11231128
case IS_STRING:
@@ -1134,6 +1139,9 @@ static zend_never_inline zend_long zend_check_string_offset(zval *container, zva
11341139
case IS_TRUE:
11351140
zend_error(E_NOTICE, "String offset cast occurred");
11361141
break;
1142+
case IS_REFERENCE:
1143+
dim = Z_REFVAL_P(dim);
1144+
goto try_again;
11371145
default:
11381146
zend_error(E_WARNING, "Illegal offset type");
11391147
break;
@@ -1269,13 +1277,13 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
12691277
{
12701278
zval *retval;
12711279

1272-
ZVAL_DEREF(container);
12731280
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
12741281
retval = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, dim_type, type TSRMLS_CC);
12751282
ZVAL_COPY(result, retval);
12761283
} else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) {
12771284
zend_long offset;
12781285

1286+
try_again:
12791287
if (UNEXPECTED(Z_TYPE_P(dim) != IS_LONG)) {
12801288
switch(Z_TYPE_P(dim)) {
12811289
/* case IS_LONG: */
@@ -1295,6 +1303,9 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
12951303
zend_error(E_NOTICE, "String offset cast occurred");
12961304
}
12971305
break;
1306+
case IS_REFERENCE:
1307+
dim = Z_REFVAL_P(dim);
1308+
goto try_again;
12981309
default:
12991310
zend_error(E_WARNING, "Illegal offset type");
13001311
break;

Zend/zend_vm_def.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,22 +1161,22 @@ ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMPVAR|CV, UNUSED|CONST|VAR)
11611161
ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_IS);
11621162
}
11631163

1164-
ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
1164+
ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMP|VAR|CV, CONST|TMPVAR|CV)
11651165
{
11661166
USE_OPLINE
11671167
zend_free_op free_op1, free_op2;
11681168
zval *container;
11691169

11701170
SAVE_OPLINE();
1171-
container = GET_OP1_ZVAL_PTR(BP_VAR_R);
1172-
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE TSRMLS_CC);
1171+
container = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
1172+
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE TSRMLS_CC);
11731173
FREE_OP2();
11741174
FREE_OP1();
11751175
CHECK_EXCEPTION();
11761176
ZEND_VM_NEXT_OPCODE();
11771177
}
11781178

1179-
ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
1179+
ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMPVAR|UNUSED|CV)
11801180
{
11811181
USE_OPLINE
11821182
zend_free_op free_op1, free_op2;
@@ -1189,7 +1189,7 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
11891189
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
11901190
}
11911191
ZVAL_DEREF(container);
1192-
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE TSRMLS_CC);
1192+
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE TSRMLS_CC);
11931193
FREE_OP2();
11941194
if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
11951195
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
@@ -1199,7 +1199,7 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
11991199
ZEND_VM_NEXT_OPCODE();
12001200
}
12011201

1202-
ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
1202+
ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMPVAR|UNUSED|CV)
12031203
{
12041204
USE_OPLINE
12051205
zend_free_op free_op1, free_op2;
@@ -1212,7 +1212,7 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
12121212
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
12131213
}
12141214
ZVAL_DEREF(container);
1215-
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE TSRMLS_CC);
1215+
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE TSRMLS_CC);
12161216
FREE_OP2();
12171217
if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
12181218
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
@@ -1222,22 +1222,22 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
12221222
ZEND_VM_NEXT_OPCODE();
12231223
}
12241224

1225-
ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
1225+
ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMP|VAR|CV, CONST|TMPVAR|CV)
12261226
{
12271227
USE_OPLINE
12281228
zend_free_op free_op1, free_op2;
12291229
zval *container;
12301230

12311231
SAVE_OPLINE();
1232-
container = GET_OP1_ZVAL_PTR(BP_VAR_IS);
1233-
zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE TSRMLS_CC);
1232+
container = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_IS);
1233+
zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE TSRMLS_CC);
12341234
FREE_OP2();
12351235
FREE_OP1();
12361236
CHECK_EXCEPTION();
12371237
ZEND_VM_NEXT_OPCODE();
12381238
}
12391239

1240-
ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUSED|CV)
1240+
ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|CV)
12411241
{
12421242
USE_OPLINE
12431243
zval *container;
@@ -1254,7 +1254,7 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNU
12541254
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
12551255
}
12561256
ZVAL_DEREF(container);
1257-
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE TSRMLS_CC);
1257+
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE TSRMLS_CC);
12581258
if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
12591259
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
12601260
}
@@ -1264,16 +1264,16 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNU
12641264
if (OP2_TYPE == IS_UNUSED) {
12651265
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
12661266
}
1267-
container = GET_OP1_ZVAL_PTR(BP_VAR_R);
1268-
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE TSRMLS_CC);
1267+
container = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
1268+
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE TSRMLS_CC);
12691269
FREE_OP2();
12701270
FREE_OP1();
12711271
}
12721272
CHECK_EXCEPTION();
12731273
ZEND_VM_NEXT_OPCODE();
12741274
}
12751275

1276-
ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMP|VAR|CV)
1276+
ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMPVAR|CV)
12771277
{
12781278
USE_OPLINE
12791279
zend_free_op free_op1, free_op2;
@@ -1286,7 +1286,7 @@ ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMP|VAR|CV)
12861286
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
12871287
}
12881288
ZVAL_DEREF(container);
1289-
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE TSRMLS_CC);
1289+
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE TSRMLS_CC);
12901290
FREE_OP2();
12911291
if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) {
12921292
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
@@ -1521,13 +1521,13 @@ ZEND_VM_HANDLER(98, ZEND_FETCH_LIST, CONST|TMP|VAR|CV, CONST)
15211521

15221522
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
15231523
zend_free_op free_op2;
1524-
zval *value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
1524+
zval *value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
15251525

15261526
ZVAL_COPY(EX_VAR(opline->result.var), value);
15271527
} else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT) &&
15281528
EXPECTED(Z_OBJ_HT_P(container)->read_dimension)) {
15291529
zval *result = EX_VAR(opline->result.var);
1530-
zval *retval = Z_OBJ_HT_P(container)->read_dimension(container, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R), BP_VAR_R, result TSRMLS_CC);
1530+
zval *retval = Z_OBJ_HT_P(container)->read_dimension(container, GET_OP2_ZVAL_PTR(BP_VAR_R), BP_VAR_R, result TSRMLS_CC);
15311531

15321532
if (retval) {
15331533
if (result != retval) {
@@ -1566,7 +1566,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV)
15661566
ZEND_VM_NEXT_OPCODE();
15671567
}
15681568

1569-
ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
1569+
ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|CV)
15701570
{
15711571
USE_OPLINE
15721572
zend_free_op free_op1;
@@ -1589,7 +1589,7 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
15891589
zend_free_op free_op2, free_op_data1;
15901590
zval rv;
15911591
zval *value;
1592-
zval *dim = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
1592+
zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
15931593
zval *variable_ptr;
15941594

15951595
if (UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STRING) &&

0 commit comments

Comments
 (0)