Skip to content

Commit a588b82

Browse files
committed
Improved assignment to "next" element of array ($a[] = ...)
1 parent a7746d1 commit a588b82

File tree

2 files changed

+775
-115
lines changed

2 files changed

+775
-115
lines changed

Zend/zend_vm_def.h

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2219,10 +2219,30 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(
22192219
ZEND_VM_C_LABEL(try_assign_dim_array):
22202220
SEPARATE_ARRAY(object_ptr);
22212221
if (OP2_TYPE == IS_UNUSED) {
2222-
variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval));
2222+
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
2223+
if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
2224+
ZVAL_DEREF(value);
2225+
}
2226+
variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), value);
22232227
if (UNEXPECTED(variable_ptr == NULL)) {
2228+
FREE_OP_DATA();
22242229
zend_cannot_add_element();
22252230
ZEND_VM_C_GOTO(assign_dim_error);
2231+
} else if (OP_DATA_TYPE == IS_CV) {
2232+
if (Z_REFCOUNTED_P(value)) {
2233+
Z_ADDREF_P(value);
2234+
}
2235+
} else if (OP_DATA_TYPE == IS_VAR) {
2236+
if (value != free_op_data) {
2237+
if (Z_REFCOUNTED_P(value)) {
2238+
Z_ADDREF_P(value);
2239+
}
2240+
FREE_OP_DATA();
2241+
}
2242+
} else if (OP_DATA_TYPE == IS_CONST) {
2243+
if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
2244+
Z_ADDREF_P(value);
2245+
}
22262246
}
22272247
} else {
22282248
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -2234,9 +2254,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
22342254
if (UNEXPECTED(variable_ptr == NULL)) {
22352255
ZEND_VM_C_GOTO(assign_dim_error);
22362256
}
2257+
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
2258+
value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
22372259
}
2238-
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
2239-
value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
22402260
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
22412261
ZVAL_COPY(EX_VAR(opline->result.var), value);
22422262
}

0 commit comments

Comments
 (0)