@@ -718,7 +718,8 @@ void zend_do_free(znode *op1) /* {{{ */
718718 if (op1 -> op_type == IS_TMP_VAR ) {
719719 zend_op * opline = & CG (active_op_array )-> opcodes [CG (active_op_array )-> last - 1 ];
720720
721- while (opline -> opcode == ZEND_END_SILENCE ) {
721+ while (opline -> opcode == ZEND_END_SILENCE ||
722+ opline -> opcode == ZEND_OP_DATA ) {
722723 opline -- ;
723724 }
724725
@@ -738,6 +739,22 @@ void zend_do_free(znode *op1) /* {{{ */
738739 opline -> opcode -= 2 ;
739740 opline -> result_type = IS_UNUSED ;
740741 return ;
742+ case ZEND_ASSIGN :
743+ case ZEND_ASSIGN_DIM :
744+ case ZEND_ASSIGN_OBJ :
745+ case ZEND_ASSIGN_STATIC_PROP :
746+ case ZEND_ASSIGN_OP :
747+ case ZEND_ASSIGN_DIM_OP :
748+ case ZEND_ASSIGN_OBJ_OP :
749+ case ZEND_ASSIGN_STATIC_PROP_OP :
750+ case ZEND_PRE_INC_STATIC_PROP :
751+ case ZEND_PRE_DEC_STATIC_PROP :
752+ case ZEND_PRE_INC_OBJ :
753+ case ZEND_PRE_DEC_OBJ :
754+ case ZEND_PRE_INC :
755+ case ZEND_PRE_DEC :
756+ opline -> result_type = IS_UNUSED ;
757+ return ;
741758 }
742759 }
743760
@@ -2921,7 +2938,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
29212938 zend_delayed_compile_var (& var_node , var_ast , BP_VAR_W , 0 );
29222939 zend_compile_expr (& expr_node , expr_ast );
29232940 zend_delayed_compile_end (offset );
2924- zend_emit_op (result , ZEND_ASSIGN , & var_node , & expr_node );
2941+ zend_emit_op_tmp (result , ZEND_ASSIGN , & var_node , & expr_node );
29252942 return ;
29262943 case ZEND_AST_STATIC_PROP :
29272944 offset = zend_delayed_compile_begin ();
@@ -2930,6 +2947,8 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
29302947
29312948 opline = zend_delayed_compile_end (offset );
29322949 opline -> opcode = ZEND_ASSIGN_STATIC_PROP ;
2950+ opline -> result_type = IS_TMP_VAR ;
2951+ result -> op_type = IS_TMP_VAR ;
29332952
29342953 zend_emit_op_data (& expr_node );
29352954 return ;
@@ -2953,6 +2972,8 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
29532972
29542973 opline = zend_delayed_compile_end (offset );
29552974 opline -> opcode = ZEND_ASSIGN_DIM ;
2975+ opline -> result_type = IS_TMP_VAR ;
2976+ result -> op_type = IS_TMP_VAR ;
29562977
29572978 opline = zend_emit_op_data (& expr_node );
29582979 return ;
@@ -2963,6 +2984,8 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
29632984
29642985 opline = zend_delayed_compile_end (offset );
29652986 opline -> opcode = ZEND_ASSIGN_OBJ ;
2987+ opline -> result_type = IS_TMP_VAR ;
2988+ result -> op_type = IS_TMP_VAR ;
29662989
29672990 zend_emit_op_data (& expr_node );
29682991 return ;
@@ -3086,7 +3109,7 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
30863109 zend_delayed_compile_var (& var_node , var_ast , BP_VAR_RW , 0 );
30873110 zend_compile_expr (& expr_node , expr_ast );
30883111 zend_delayed_compile_end (offset );
3089- opline = zend_emit_op (result , ZEND_ASSIGN_OP , & var_node , & expr_node );
3112+ opline = zend_emit_op_tmp (result , ZEND_ASSIGN_OP , & var_node , & expr_node );
30903113 opline -> extended_value = opcode ;
30913114 return ;
30923115 case ZEND_AST_STATIC_PROP :
@@ -3098,6 +3121,8 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
30983121 cache_slot = opline -> extended_value ;
30993122 opline -> opcode = ZEND_ASSIGN_STATIC_PROP_OP ;
31003123 opline -> extended_value = opcode ;
3124+ opline -> result_type = IS_TMP_VAR ;
3125+ result -> op_type = IS_TMP_VAR ;
31013126
31023127 opline = zend_emit_op_data (& expr_node );
31033128 opline -> extended_value = cache_slot ;
@@ -3110,6 +3135,8 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
31103135 opline = zend_delayed_compile_end (offset );
31113136 opline -> opcode = ZEND_ASSIGN_DIM_OP ;
31123137 opline -> extended_value = opcode ;
3138+ opline -> result_type = IS_TMP_VAR ;
3139+ result -> op_type = IS_TMP_VAR ;
31133140
31143141 zend_emit_op_data (& expr_node );
31153142 return ;
@@ -3122,6 +3149,8 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
31223149 cache_slot = opline -> extended_value ;
31233150 opline -> opcode = ZEND_ASSIGN_OBJ_OP ;
31243151 opline -> extended_value = opcode ;
3152+ opline -> result_type = IS_TMP_VAR ;
3153+ result -> op_type = IS_TMP_VAR ;
31253154
31263155 opline = zend_emit_op_data (& expr_node );
31273156 opline -> extended_value = cache_slot ;
@@ -3236,11 +3265,9 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
32363265 opcode = ZEND_SEND_VAR_EX ;
32373266 }
32383267 } else {
3239- if (fbc ) {
3268+ /* Delay "Only variables can be passed by reference" error to execution */
3269+ if (fbc && !ARG_MUST_BE_SENT_BY_REF (fbc , arg_num )) {
32403270 opcode = ZEND_SEND_VAL ;
3241- if (ARG_MUST_BE_SENT_BY_REF (fbc , arg_num )) {
3242- zend_error_noreturn (E_COMPILE_ERROR , "Only variables can be passed by reference" );
3243- }
32443271 } else {
32453272 opcode = ZEND_SEND_VAL_EX ;
32463273 }
@@ -7577,13 +7604,17 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */
75777604 if (var_ast -> kind == ZEND_AST_PROP ) {
75787605 zend_op * opline = zend_compile_prop (result , var_ast , BP_VAR_RW , 0 );
75797606 opline -> opcode = ast -> kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_OBJ : ZEND_PRE_DEC_OBJ ;
7607+ opline -> result_type = IS_TMP_VAR ;
7608+ result -> op_type = IS_TMP_VAR ;
75807609 } else if (var_ast -> kind == ZEND_AST_STATIC_PROP ) {
75817610 zend_op * opline = zend_compile_static_prop (result , var_ast , BP_VAR_RW , 0 , 0 );
75827611 opline -> opcode = ast -> kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_STATIC_PROP : ZEND_PRE_DEC_STATIC_PROP ;
7612+ opline -> result_type = IS_TMP_VAR ;
7613+ result -> op_type = IS_TMP_VAR ;
75837614 } else {
75847615 znode var_node ;
75857616 zend_compile_var (& var_node , var_ast , BP_VAR_RW , 0 );
7586- zend_emit_op (result , ast -> kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC : ZEND_PRE_DEC ,
7617+ zend_emit_op_tmp (result , ast -> kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC : ZEND_PRE_DEC ,
75877618 & var_node , NULL );
75887619 }
75897620}
@@ -7764,20 +7795,26 @@ void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */
77647795 opline = & CG (active_op_array )-> opcodes [CG (active_op_array )-> last - 1 ];
77657796 switch (var_ast -> kind ) {
77667797 case ZEND_AST_VAR :
7767- zend_emit_op (& assign_node , ZEND_ASSIGN , & var_node_w , & default_node );
7798+ zend_emit_op_tmp (& assign_node , ZEND_ASSIGN , & var_node_w , & default_node );
77687799 break ;
77697800 case ZEND_AST_STATIC_PROP :
77707801 opline -> opcode = ZEND_ASSIGN_STATIC_PROP ;
7802+ opline -> result_type = IS_TMP_VAR ;
7803+ var_node_w .op_type = IS_TMP_VAR ;
77717804 zend_emit_op_data (& default_node );
77727805 assign_node = var_node_w ;
77737806 break ;
77747807 case ZEND_AST_DIM :
77757808 opline -> opcode = ZEND_ASSIGN_DIM ;
7809+ opline -> result_type = IS_TMP_VAR ;
7810+ var_node_w .op_type = IS_TMP_VAR ;
77767811 zend_emit_op_data (& default_node );
77777812 assign_node = var_node_w ;
77787813 break ;
77797814 case ZEND_AST_PROP :
77807815 opline -> opcode = ZEND_ASSIGN_OBJ ;
7816+ opline -> result_type = IS_TMP_VAR ;
7817+ var_node_w .op_type = IS_TMP_VAR ;
77817818 zend_emit_op_data (& default_node );
77827819 assign_node = var_node_w ;
77837820 break ;
0 commit comments