@@ -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 );
@@ -2577,12 +2585,32 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
2577
2585
}
2578
2586
}
2579
2587
if (EXPECTED (Z_TYPE_P (object_ptr ) == IS_OBJECT )) {
2580
- dim = GET_OP2_ZVAL_PTR (BP_VAR_R );
2581
- value = GET_OP_DATA_ZVAL_PTR_DEREF (BP_VAR_R );
2582
-
2583
- if (OP2_TYPE == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2588
+ dim = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
2589
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_ISUNDEF_P (dim ))) {
2590
+ zend_object * obj = Z_OBJ_P (object_ptr );
2591
+ GC_ADDREF (obj );
2592
+ dim = ZVAL_UNDEFINED_OP2 ();
2593
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2594
+ zend_objects_store_del (obj );
2595
+ ZEND_VM_C_GOTO (assign_dim_error );
2596
+ }
2597
+ } else if (OP2_TYPE == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2584
2598
dim ++ ;
2585
2599
}
2600
+
2601
+ value = GET_OP_DATA_ZVAL_PTR_UNDEF (BP_VAR_R );
2602
+ if (OP_DATA_TYPE == IS_CV && UNEXPECTED (Z_ISUNDEF_P (value ))) {
2603
+ zend_object * obj = Z_OBJ_P (object_ptr );
2604
+ GC_ADDREF (obj );
2605
+ value = zval_undefined_cv ((opline + 1 )-> op1 .var EXECUTE_DATA_CC );
2606
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2607
+ zend_objects_store_del (obj );
2608
+ ZEND_VM_C_GOTO (assign_dim_error );
2609
+ }
2610
+ } else if (OP_DATA_TYPE & (IS_CV |IS_VAR )) {
2611
+ ZVAL_DEREF (value );
2612
+ }
2613
+
2586
2614
zend_assign_to_object_dim (object_ptr , dim , value OPLINE_CC EXECUTE_DATA_CC );
2587
2615
2588
2616
FREE_OP_DATA ();
0 commit comments