@@ -2219,10 +2219,30 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(
2219
2219
ZEND_VM_C_LABEL (try_assign_dim_array ):
2220
2220
SEPARATE_ARRAY (object_ptr );
2221
2221
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 );
2223
2227
if (UNEXPECTED (variable_ptr == NULL )) {
2228
+ FREE_OP_DATA ();
2224
2229
zend_cannot_add_element ();
2225
2230
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
+ }
2226
2246
}
2227
2247
} else {
2228
2248
dim = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
@@ -2234,9 +2254,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
2234
2254
if (UNEXPECTED (variable_ptr == NULL )) {
2235
2255
ZEND_VM_C_GOTO (assign_dim_error );
2236
2256
}
2257
+ value = GET_OP_DATA_ZVAL_PTR (BP_VAR_R );
2258
+ value = zend_assign_to_variable (variable_ptr , value , OP_DATA_TYPE );
2237
2259
}
2238
- value = GET_OP_DATA_ZVAL_PTR (BP_VAR_R );
2239
- value = zend_assign_to_variable (variable_ptr , value , OP_DATA_TYPE );
2240
2260
if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
2241
2261
ZVAL_COPY (EX_VAR (opline -> result .var ), value );
2242
2262
}
0 commit comments