@@ -2723,7 +2723,7 @@ static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node)
2723
2723
}
2724
2724
/* }}} */
2725
2725
2726
- static zend_op * zend_delayed_compile_dim (znode * result , zend_ast * ast , uint32_t type ) /* {{{ */
2726
+ static zend_op * zend_delayed_compile_dim (znode * result , zend_ast * ast , uint32_t type , bool by_ref )
2727
2727
{
2728
2728
if (ast -> attr == ZEND_DIM_ALTERNATIVE_SYNTAX ) {
2729
2729
zend_error (E_COMPILE_ERROR , "Array and string offset access syntax with curly braces is no longer supported" );
@@ -2751,8 +2751,15 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t
2751
2751
} else {
2752
2752
zend_short_circuiting_mark_inner (var_ast );
2753
2753
opline = zend_delayed_compile_var (& var_node , var_ast , type , 0 );
2754
- if (opline && type == BP_VAR_W && (opline -> opcode == ZEND_FETCH_STATIC_PROP_W || opline -> opcode == ZEND_FETCH_OBJ_W )) {
2755
- opline -> extended_value |= ZEND_FETCH_DIM_WRITE ;
2754
+ if (opline ) {
2755
+ if (type == BP_VAR_W && (opline -> opcode == ZEND_FETCH_STATIC_PROP_W || opline -> opcode == ZEND_FETCH_OBJ_W )) {
2756
+ opline -> extended_value |= ZEND_FETCH_DIM_WRITE ;
2757
+ } else if (opline -> opcode == ZEND_FETCH_DIM_W
2758
+ || opline -> opcode == ZEND_FETCH_DIM_RW
2759
+ || opline -> opcode == ZEND_FETCH_DIM_FUNC_ARG
2760
+ || opline -> opcode == ZEND_FETCH_DIM_UNSET ) {
2761
+ opline -> extended_value = ZEND_FETCH_DIM_DIM ;
2762
+ }
2756
2763
}
2757
2764
}
2758
2765
@@ -2772,18 +2779,20 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t
2772
2779
2773
2780
opline = zend_delayed_emit_op (result , ZEND_FETCH_DIM_R , & var_node , & dim_node );
2774
2781
zend_adjust_for_fetch_type (opline , result , type );
2782
+ if (by_ref ) {
2783
+ opline -> extended_value = ZEND_FETCH_DIM_REF ;
2784
+ }
2775
2785
2776
2786
if (dim_node .op_type == IS_CONST ) {
2777
2787
zend_handle_numeric_dim (opline , & dim_node );
2778
2788
}
2779
2789
return opline ;
2780
2790
}
2781
- /* }}} */
2782
2791
2783
- static zend_op * zend_compile_dim (znode * result , zend_ast * ast , uint32_t type ) /* {{{ */
2792
+ static zend_op * zend_compile_dim (znode * result , zend_ast * ast , uint32_t type , bool by_ref ) /* {{{ */
2784
2793
{
2785
2794
uint32_t offset = zend_delayed_compile_begin ();
2786
- zend_delayed_compile_dim (result , ast , type );
2795
+ zend_delayed_compile_dim (result , ast , type , by_ref );
2787
2796
return zend_delayed_compile_end (offset );
2788
2797
}
2789
2798
/* }}} */
@@ -2810,6 +2819,13 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
2810
2819
} else {
2811
2820
zend_short_circuiting_mark_inner (obj_ast );
2812
2821
opline = zend_delayed_compile_var (& obj_node , obj_ast , type , 0 );
2822
+ if (opline && (opline -> opcode == ZEND_FETCH_DIM_W
2823
+ || opline -> opcode == ZEND_FETCH_DIM_RW
2824
+ || opline -> opcode == ZEND_FETCH_DIM_FUNC_ARG
2825
+ || opline -> opcode == ZEND_FETCH_DIM_UNSET )) {
2826
+ opline -> extended_value = ZEND_FETCH_DIM_OBJ ;
2827
+ }
2828
+
2813
2829
zend_separate_if_call_and_write (& obj_node , obj_ast , type );
2814
2830
if (nullsafe ) {
2815
2831
/* We will push to the short_circuiting_opnums stack in zend_delayed_compile_end(). */
@@ -3113,7 +3129,7 @@ static void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
3113
3129
return ;
3114
3130
case ZEND_AST_DIM :
3115
3131
offset = zend_delayed_compile_begin ();
3116
- zend_delayed_compile_dim (result , var_ast , BP_VAR_W );
3132
+ zend_delayed_compile_dim (result , var_ast , BP_VAR_W , /* by_ref */ false );
3117
3133
3118
3134
if (zend_is_assign_to_self (var_ast , expr_ast )
3119
3135
&& !is_this_fetch (expr_ast )) {
@@ -3296,7 +3312,7 @@ static void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
3296
3312
return ;
3297
3313
case ZEND_AST_DIM :
3298
3314
offset = zend_delayed_compile_begin ();
3299
- zend_delayed_compile_dim (result , var_ast , BP_VAR_RW );
3315
+ zend_delayed_compile_dim (result , var_ast , BP_VAR_RW , /* by_ref */ false );
3300
3316
zend_compile_expr (& expr_node , expr_ast );
3301
3317
3302
3318
opline = zend_delayed_compile_end (offset );
@@ -4709,7 +4725,7 @@ static void zend_compile_unset(zend_ast *ast) /* {{{ */
4709
4725
}
4710
4726
return ;
4711
4727
case ZEND_AST_DIM :
4712
- opline = zend_compile_dim (NULL , var_ast , BP_VAR_UNSET );
4728
+ opline = zend_compile_dim (NULL , var_ast , BP_VAR_UNSET , /* by_ref */ false );
4713
4729
opline -> opcode = ZEND_UNSET_DIM ;
4714
4730
return ;
4715
4731
case ZEND_AST_PROP :
@@ -8681,7 +8697,10 @@ static void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */
8681
8697
zend_make_tmp_result (result , opline );
8682
8698
} else {
8683
8699
znode var_node ;
8684
- zend_compile_var (& var_node , var_ast , BP_VAR_RW , 0 );
8700
+ zend_op * opline = zend_compile_var (& var_node , var_ast , BP_VAR_RW , 0 );
8701
+ if (opline && opline -> opcode == ZEND_FETCH_DIM_RW ) {
8702
+ opline -> extended_value = ZEND_FETCH_DIM_INCDEC ;
8703
+ }
8685
8704
zend_emit_op_tmp (result , ast -> kind == ZEND_AST_POST_INC ? ZEND_POST_INC : ZEND_POST_DEC ,
8686
8705
& var_node , NULL );
8687
8706
}
@@ -8707,7 +8726,10 @@ static void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */
8707
8726
result -> op_type = IS_TMP_VAR ;
8708
8727
} else {
8709
8728
znode var_node ;
8710
- zend_compile_var (& var_node , var_ast , BP_VAR_RW , 0 );
8729
+ zend_op * opline = zend_compile_var (& var_node , var_ast , BP_VAR_RW , 0 );
8730
+ if (opline && opline -> opcode == ZEND_FETCH_DIM_RW ) {
8731
+ opline -> extended_value = ZEND_FETCH_DIM_INCDEC ;
8732
+ }
8711
8733
zend_emit_op_tmp (result , ast -> kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC : ZEND_PRE_DEC ,
8712
8734
& var_node , NULL );
8713
8735
}
@@ -9154,7 +9176,7 @@ static void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
9154
9176
}
9155
9177
break ;
9156
9178
case ZEND_AST_DIM :
9157
- opline = zend_compile_dim (result , var_ast , BP_VAR_IS );
9179
+ opline = zend_compile_dim (result , var_ast , BP_VAR_IS , /* by_ref */ false );
9158
9180
opline -> opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ ;
9159
9181
break ;
9160
9182
case ZEND_AST_PROP :
@@ -10114,7 +10136,7 @@ static zend_op *zend_compile_var_inner(znode *result, zend_ast *ast, uint32_t ty
10114
10136
case ZEND_AST_VAR :
10115
10137
return zend_compile_simple_var (result , ast , type , 0 );
10116
10138
case ZEND_AST_DIM :
10117
- return zend_compile_dim (result , ast , type );
10139
+ return zend_compile_dim (result , ast , type , by_ref );
10118
10140
case ZEND_AST_PROP :
10119
10141
case ZEND_AST_NULLSAFE_PROP :
10120
10142
return zend_compile_prop (result , ast , type , by_ref );
@@ -10158,7 +10180,7 @@ static zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t
10158
10180
case ZEND_AST_VAR :
10159
10181
return zend_compile_simple_var (result , ast , type , 1 );
10160
10182
case ZEND_AST_DIM :
10161
- return zend_delayed_compile_dim (result , ast , type );
10183
+ return zend_delayed_compile_dim (result , ast , type , by_ref );
10162
10184
case ZEND_AST_PROP :
10163
10185
case ZEND_AST_NULLSAFE_PROP :
10164
10186
{
0 commit comments