@@ -3062,7 +3062,7 @@ static void zend_compile_list_assign(
3062
3062
3063
3063
for (i = 0 ; i < list -> children ; ++ i ) {
3064
3064
zend_ast * elem_ast = list -> child [i ];
3065
- zend_ast * var_ast , * key_ast ;
3065
+ zend_ast * var_ast , * key_ast , * coaleasce_default_ast = NULL ;
3066
3066
znode fetch_result , dim_node ;
3067
3067
zend_op * opline ;
3068
3068
@@ -3105,16 +3105,38 @@ static void zend_compile_list_assign(
3105
3105
Z_TRY_ADDREF (expr_node -> u .constant );
3106
3106
}
3107
3107
3108
+ zend_uchar opcode = ZEND_FETCH_LIST_R ;
3109
+ if (var_ast -> kind == ZEND_AST_COALESCE ) {
3110
+ coaleasce_default_ast = var_ast -> child [1 ];
3111
+ var_ast = var_ast -> child [0 ];
3112
+
3113
+ opcode = ZEND_FETCH_LIST_IS ;
3114
+ } else if (elem_ast -> attr ) {
3115
+ opcode = expr_node -> op_type == IS_CV ? ZEND_FETCH_DIM_W : ZEND_FETCH_LIST_W ;
3116
+ }
3117
+
3108
3118
zend_verify_list_assign_target (var_ast , array_style );
3109
3119
3110
- opline = zend_emit_op (& fetch_result ,
3111
- elem_ast -> attr ? (expr_node -> op_type == IS_CV ? ZEND_FETCH_DIM_W : ZEND_FETCH_LIST_W ) : ZEND_FETCH_LIST_R , expr_node , & dim_node );
3120
+ opline = zend_emit_op (& fetch_result , opcode , expr_node , & dim_node );
3112
3121
3113
3122
if (dim_node .op_type == IS_CONST ) {
3114
3123
zend_handle_numeric_dim (opline , & dim_node );
3115
3124
}
3116
3125
3117
- if (elem_ast -> attr ) {
3126
+ if (coaleasce_default_ast ) {
3127
+ znode default_node ;
3128
+
3129
+ uint32_t opnum = get_next_op_number ();
3130
+ zend_emit_op_tmp (& fetch_result , ZEND_COALESCE , & fetch_result , NULL );
3131
+
3132
+ zend_compile_expr (& default_node , coaleasce_default_ast );
3133
+
3134
+ opline = zend_emit_op_tmp (NULL , ZEND_QM_ASSIGN , & default_node , NULL );
3135
+ SET_NODE (opline -> result , & fetch_result );
3136
+
3137
+ opline = & CG (active_op_array )-> opcodes [opnum ];
3138
+ opline -> op2 .opline_num = get_next_op_number ();
3139
+ } else if (elem_ast -> attr ) {
3118
3140
zend_emit_op (& fetch_result , ZEND_MAKE_REF , & fetch_result , NULL );
3119
3141
}
3120
3142
if (var_ast -> kind == ZEND_AST_ARRAY ) {
0 commit comments