@@ -643,8 +643,11 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
643
643
opline -> opcode != ZEND_FREE
644
644
) {
645
645
zend_op * src = VAR_SOURCE (opline -> op1 );
646
+ zval c = ZEND_OP1_LITERAL (src );
646
647
VAR_UNSET (opline -> op1 );
647
- COPY_NODE (opline -> op1 , src -> op1 );
648
+ zval_copy_ctor (& c );
649
+ update_op1_const (op_array , opline , & c TSRMLS_CC );
650
+ literal_dtor (& ZEND_OP1_LITERAL (src ));
648
651
MAKE_NOP (src );
649
652
}
650
653
@@ -654,51 +657,12 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
654
657
VAR_SOURCE (opline -> op2 )-> opcode == ZEND_QM_ASSIGN &&
655
658
ZEND_OP1_TYPE (VAR_SOURCE (opline -> op2 )) == IS_CONST ) {
656
659
zend_op * src = VAR_SOURCE (opline -> op2 );
660
+ zval c = ZEND_OP1_LITERAL (src );
657
661
VAR_UNSET (opline -> op2 );
658
- COPY_NODE (opline -> op2 , src -> op1 );
662
+ zval_copy_ctor (& c );
663
+ update_op2_const (op_array , opline , & c TSRMLS_CC );
664
+ literal_dtor (& ZEND_OP1_LITERAL (src ));
659
665
MAKE_NOP (src );
660
-
661
- #if ZEND_EXTENSION_API_NO >= PHP_5_4_X_API_NO
662
- /* numeric string constants used as array indeces have to be
663
- converted to long at compile time */
664
- if (opline -> opcode == ZEND_ADD_ARRAY_ELEMENT ||
665
- opline -> opcode == ZEND_INIT_ARRAY ||
666
- opline -> opcode == ZEND_UNSET_DIM ||
667
- opline -> opcode == ZEND_ISSET_ISEMPTY_DIM_OBJ ||
668
- opline -> opcode == ZEND_FETCH_DIM_R ||
669
- opline -> opcode == ZEND_FETCH_DIM_W ||
670
- opline -> opcode == ZEND_FETCH_DIM_RW ||
671
- opline -> opcode == ZEND_FETCH_DIM_IS ||
672
- opline -> opcode == ZEND_FETCH_DIM_FUNC_ARG ||
673
- opline -> opcode == ZEND_FETCH_DIM_UNSET ||
674
- opline -> opcode == ZEND_FETCH_DIM_TMP_VAR ||
675
- (opline -> opcode == ZEND_OP_DATA &&
676
- ((opline - 1 )-> opcode == ZEND_ASSIGN_DIM ||
677
- ((opline - 1 )-> extended_value == ZEND_ASSIGN_DIM &&
678
- ((opline - 1 )-> opcode == ZEND_ASSIGN_ADD ||
679
- (opline - 1 )-> opcode == ZEND_ASSIGN_SUB ||
680
- (opline - 1 )-> opcode == ZEND_ASSIGN_MUL ||
681
- (opline - 1 )-> opcode == ZEND_ASSIGN_DIV ||
682
- (opline - 1 )-> opcode == ZEND_ASSIGN_MOD ||
683
- (opline - 1 )-> opcode == ZEND_ASSIGN_SL ||
684
- (opline - 1 )-> opcode == ZEND_ASSIGN_SR ||
685
- (opline - 1 )-> opcode == ZEND_ASSIGN_CONCAT ||
686
- (opline - 1 )-> opcode == ZEND_ASSIGN_BW_OR ||
687
- (opline - 1 )-> opcode == ZEND_ASSIGN_BW_AND ||
688
- (opline - 1 )-> opcode == ZEND_ASSIGN_BW_XOR ))))) {
689
-
690
- if (Z_TYPE (ZEND_OP2_LITERAL (opline )) == IS_STRING ) {
691
- ulong index ;
692
- int numeric = 0 ;
693
-
694
- ZEND_HANDLE_NUMERIC_EX (Z_STRVAL (ZEND_OP2_LITERAL (opline )), Z_STRLEN (ZEND_OP2_LITERAL (opline ))+ 1 , index , numeric = 1 );
695
- if (numeric ) {
696
- zval_dtor (& ZEND_OP2_LITERAL (opline ));
697
- ZVAL_LONG (& ZEND_OP2_LITERAL (opline ), index );
698
- }
699
- }
700
- }
701
- #endif
702
666
}
703
667
704
668
/* T = PRINT(X), F(T) => ECHO(X), F(1) */
@@ -1070,10 +1034,9 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
1070
1034
1071
1035
literal_dtor (& ZEND_OP1_LITERAL (opline ));
1072
1036
literal_dtor (& ZEND_OP2_LITERAL (opline ));
1073
- ZEND_OP1_LITERAL (opline ) = result ;
1074
- SET_UNUSED (opline -> op2 );
1075
-
1076
1037
opline -> opcode = ZEND_QM_ASSIGN ;
1038
+ SET_UNUSED (opline -> op2 );
1039
+ update_op1_const (op_array , opline , & result TSRMLS_CC );
1077
1040
}
1078
1041
EG (error_reporting ) = er ;
1079
1042
} else if ((opline -> opcode == ZEND_BOOL ||
@@ -1097,8 +1060,8 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
1097
1060
}
1098
1061
PZ_SET_REFCOUNT_P (& result , 1 );
1099
1062
PZ_UNSET_ISREF_P (& result );
1100
- ZEND_OP1_LITERAL (opline ) = result ;
1101
1063
opline -> opcode = ZEND_QM_ASSIGN ;
1064
+ update_op1_const (op_array , opline , & result TSRMLS_CC );
1102
1065
} else if ((opline -> opcode == ZEND_RETURN || opline -> opcode == ZEND_EXIT ) &&
1103
1066
ZEND_OP1_TYPE (opline ) == IS_TMP_VAR &&
1104
1067
VAR_SOURCE (opline -> op1 ) &&
0 commit comments