Skip to content

Commit b16fc35

Browse files
committed
Move common code into helper
1 parent 1a6863c commit b16fc35

File tree

3 files changed

+61
-99
lines changed

3 files changed

+61
-99
lines changed

Zend/zend_execute.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,6 +1431,10 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
14311431
zval *z;
14321432
zval rv, res;
14331433

1434+
GC_ADDREF(obj);
1435+
if (property && UNEXPECTED(Z_ISUNDEF_P(property))) {
1436+
property = ZVAL_UNDEFINED_OP2();
1437+
}
14341438
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1);
14351439
if ((z = obj->handlers->read_dimension(obj, property, BP_VAR_R, &rv)) != NULL) {
14361440

@@ -1451,6 +1455,9 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
14511455
}
14521456
}
14531457
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
1458+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
1459+
zend_objects_store_del(obj);
1460+
}
14541461
}
14551462

14561463
static zend_never_inline void zend_binary_assign_op_typed_ref(zend_reference *ref, zval *value OPLINE_DC EXECUTE_DATA_DC)

Zend/zend_vm_def.h

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,26 +1150,28 @@ ZEND_VM_HANDLER(27, ZEND_ASSIGN_DIM_OP, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, OP)
11501150
USE_OPLINE
11511151
zval *var_ptr;
11521152
zval *value, *container, *dim;
1153+
HashTable *ht;
11531154

11541155
SAVE_OPLINE();
11551156
container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
11561157

11571158
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
11581159
ZEND_VM_C_LABEL(assign_dim_op_array):
11591160
SEPARATE_ARRAY(container);
1161+
ht = Z_ARRVAL_P(container);
11601162
ZEND_VM_C_LABEL(assign_dim_op_new_array):
11611163
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
11621164
if (OP2_TYPE == IS_UNUSED) {
1163-
var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
1165+
var_ptr = zend_hash_next_index_insert(ht, &EG(uninitialized_zval));
11641166
if (UNEXPECTED(!var_ptr)) {
11651167
zend_cannot_add_element();
11661168
ZEND_VM_C_GOTO(assign_dim_op_ret_null);
11671169
}
11681170
} else {
11691171
if (OP2_TYPE == IS_CONST) {
1170-
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
1172+
var_ptr = zend_fetch_dimension_address_inner_RW_CONST(ht, dim EXECUTE_DATA_CC);
11711173
} else {
1172-
var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
1174+
var_ptr = zend_fetch_dimension_address_inner_RW(ht, dim EXECUTE_DATA_CC);
11731175
}
11741176
if (UNEXPECTED(!var_ptr)) {
11751177
ZEND_VM_C_GOTO(assign_dim_op_ret_null);
@@ -1205,19 +1207,12 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
12051207
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
12061208
zend_object *obj = Z_OBJ_P(container);
12071209

1208-
GC_ADDREF(obj);
12091210
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
1210-
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
1211-
dim = ZVAL_UNDEFINED_OP2();
1212-
} else if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
1211+
if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
12131212
dim++;
12141213
}
12151214
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
1216-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
1217-
zend_objects_store_del(obj);
1218-
}
12191215
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
1220-
HashTable *ht;
12211216
zend_uchar old_type;
12221217

12231218
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {

0 commit comments

Comments
 (0)