@@ -1203,8 +1203,16 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
1203
1203
}
1204
1204
1205
1205
if (EXPECTED (Z_TYPE_P (container ) == IS_OBJECT )) {
1206
- dim = GET_OP2_ZVAL_PTR (BP_VAR_R );
1207
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
1206
+ dim = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
1207
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_ISUNDEF_P (dim ))) {
1208
+ zend_object * obj = Z_OBJ_P (container );
1209
+ GC_ADDREF (obj );
1210
+ dim = ZVAL_UNDEFINED_OP2 ();
1211
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
1212
+ zend_objects_store_del (obj );
1213
+ ZEND_VM_C_GOTO (assign_dim_op_ret_null );
1214
+ }
1215
+ } else if (OP2_TYPE == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
1208
1216
dim ++ ;
1209
1217
}
1210
1218
zend_binary_assign_op_obj_dim (container , dim OPLINE_CC EXECUTE_DATA_CC );
@@ -2575,12 +2583,32 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
2575
2583
}
2576
2584
}
2577
2585
if (EXPECTED (Z_TYPE_P (object_ptr ) == IS_OBJECT )) {
2578
- dim = GET_OP2_ZVAL_PTR (BP_VAR_R );
2579
- value = GET_OP_DATA_ZVAL_PTR_DEREF (BP_VAR_R );
2580
-
2581
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2586
+ dim = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
2587
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_ISUNDEF_P (dim ))) {
2588
+ zend_object * obj = Z_OBJ_P (object_ptr );
2589
+ GC_ADDREF (obj );
2590
+ dim = ZVAL_UNDEFINED_OP2 ();
2591
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2592
+ zend_objects_store_del (obj );
2593
+ ZEND_VM_C_GOTO (assign_dim_error );
2594
+ }
2595
+ } else if (OP2_TYPE == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2582
2596
dim ++ ;
2583
2597
}
2598
+
2599
+ value = GET_OP_DATA_ZVAL_PTR_UNDEF (BP_VAR_R );
2600
+ if (OP_DATA_TYPE == IS_CV && UNEXPECTED (Z_ISUNDEF_P (value ))) {
2601
+ zend_object * obj = Z_OBJ_P (object_ptr );
2602
+ GC_ADDREF (obj );
2603
+ value = zval_undefined_cv ((opline + 1 )-> op1 .var EXECUTE_DATA_CC );
2604
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2605
+ zend_objects_store_del (obj );
2606
+ ZEND_VM_C_GOTO (assign_dim_error );
2607
+ }
2608
+ } else if (OP_DATA_TYPE & (IS_CV |IS_VAR )) {
2609
+ ZVAL_DEREF (value );
2610
+ }
2611
+
2584
2612
zend_assign_to_object_dim (object_ptr , dim , value OPLINE_CC EXECUTE_DATA_CC );
2585
2613
2586
2614
FREE_OP_DATA ();
0 commit comments