@@ -3152,6 +3152,22 @@ static bool zend_is_assign_to_self(zend_ast *var_ast, zend_ast *expr_ast) /* {{{
3152
3152
}
3153
3153
/* }}} */
3154
3154
3155
+ static void zend_compile_expr_with_potential_assign_to_self (
3156
+ znode * expr_node , zend_ast * expr_ast , zend_ast * var_ast ) {
3157
+ if (zend_is_assign_to_self (var_ast , expr_ast ) && !is_this_fetch (expr_ast )) {
3158
+ /* $a[0] = $a should evaluate the right $a first */
3159
+ znode cv_node ;
3160
+
3161
+ if (zend_try_compile_cv (& cv_node , expr_ast ) == FAILURE ) {
3162
+ zend_compile_simple_var_no_cv (expr_node , expr_ast , BP_VAR_R , 0 );
3163
+ } else {
3164
+ zend_emit_op_tmp (expr_node , ZEND_QM_ASSIGN , & cv_node , NULL );
3165
+ }
3166
+ } else {
3167
+ zend_compile_expr (expr_node , expr_ast );
3168
+ }
3169
+ }
3170
+
3155
3171
static void zend_compile_assign (znode * result , zend_ast * ast ) /* {{{ */
3156
3172
{
3157
3173
zend_ast * var_ast = ast -> child [0 ];
@@ -3192,20 +3208,7 @@ static void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
3192
3208
case ZEND_AST_DIM :
3193
3209
offset = zend_delayed_compile_begin ();
3194
3210
zend_delayed_compile_dim (result , var_ast , BP_VAR_W );
3195
-
3196
- if (zend_is_assign_to_self (var_ast , expr_ast )
3197
- && !is_this_fetch (expr_ast )) {
3198
- /* $a[0] = $a should evaluate the right $a first */
3199
- znode cv_node ;
3200
-
3201
- if (zend_try_compile_cv (& cv_node , expr_ast ) == FAILURE ) {
3202
- zend_compile_simple_var_no_cv (& expr_node , expr_ast , BP_VAR_R , 0 );
3203
- } else {
3204
- zend_emit_op_tmp (& expr_node , ZEND_QM_ASSIGN , & cv_node , NULL );
3205
- }
3206
- } else {
3207
- zend_compile_expr (& expr_node , expr_ast );
3208
- }
3211
+ zend_compile_expr_with_potential_assign_to_self (& expr_node , expr_ast , var_ast );
3209
3212
3210
3213
opline = zend_delayed_compile_end (offset );
3211
3214
opline -> opcode = ZEND_ASSIGN_DIM ;
@@ -3375,7 +3378,7 @@ static void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
3375
3378
case ZEND_AST_DIM :
3376
3379
offset = zend_delayed_compile_begin ();
3377
3380
zend_delayed_compile_dim (result , var_ast , BP_VAR_RW );
3378
- zend_compile_expr (& expr_node , expr_ast );
3381
+ zend_compile_expr_with_potential_assign_to_self (& expr_node , expr_ast , var_ast );
3379
3382
3380
3383
opline = zend_delayed_compile_end (offset );
3381
3384
opline -> opcode = ZEND_ASSIGN_DIM_OP ;
@@ -8962,17 +8965,8 @@ static void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */
8962
8965
zend_emit_op_tmp (result , ZEND_COALESCE , & var_node_is , NULL );
8963
8966
8964
8967
CG (memoize_mode ) = ZEND_MEMOIZE_NONE ;
8965
- if (var_ast -> kind == ZEND_AST_DIM
8966
- && zend_is_assign_to_self (var_ast , default_ast )
8967
- && !is_this_fetch (default_ast )) {
8968
- /* $a[0] = $a should evaluate the right $a first */
8969
- znode cv_node ;
8970
-
8971
- if (zend_try_compile_cv (& cv_node , default_ast ) == FAILURE ) {
8972
- zend_compile_simple_var_no_cv (& default_node , default_ast , BP_VAR_R , 0 );
8973
- } else {
8974
- zend_emit_op_tmp (& default_node , ZEND_QM_ASSIGN , & cv_node , NULL );
8975
- }
8968
+ if (var_ast -> kind == ZEND_AST_DIM ) {
8969
+ zend_compile_expr_with_potential_assign_to_self (& default_node , default_ast , var_ast );
8976
8970
} else {
8977
8971
zend_compile_expr (& default_node , default_ast );
8978
8972
}
0 commit comments