@@ -37,7 +37,6 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
37
37
int (* binary_op )(zval * result , zval * op1 , zval * op2 TSRMLS_DC ) = get_binary_op (opline -> opcode );
38
38
zend_uint tv = ZEND_RESULT (opline ).var ; /* temporary variable */
39
39
zval result ;
40
- zend_op * tmp_opline ;
41
40
int er ;
42
41
43
42
if (opline -> opcode == ZEND_DIV &&
@@ -61,95 +60,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
61
60
literal_dtor (& ZEND_OP2_LITERAL (opline ));
62
61
MAKE_NOP (opline );
63
62
64
- /* substitute the following TMP_VAR usage with constant */
65
- for (tmp_opline = opline + 1 ; tmp_opline < end ; tmp_opline ++ ) {
66
- if (ZEND_OP1_TYPE (tmp_opline ) == IS_TMP_VAR &&
67
- ZEND_OP1 (tmp_opline ).var == tv ) {
68
- if (tmp_opline -> opcode == ZEND_FREE ) {
69
- MAKE_NOP (tmp_opline );
70
- zval_dtor (& result );
71
- } else {
72
- ZEND_OP1_TYPE (tmp_opline ) = IS_CONST ;
73
- #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
74
- tmp_opline -> op1 .constant = zend_optimizer_add_literal (op_array , & result TSRMLS_CC );
75
- if (Z_TYPE (result ) == IS_STRING ) {
76
- Z_HASH_P (& ZEND_OP1_LITERAL (tmp_opline )) = zend_hash_func (Z_STRVAL (ZEND_OP1_LITERAL (tmp_opline )), Z_STRLEN (ZEND_OP1_LITERAL (tmp_opline )) + 1 );
77
- if (tmp_opline -> opcode == ZEND_INIT_STATIC_METHOD_CALL ||
78
- tmp_opline -> opcode == ZEND_DO_FCALL ||
79
- tmp_opline -> opcode == ZEND_CATCH ||
80
- tmp_opline -> opcode == ZEND_FETCH_CONSTANT ) {
81
- op_array -> literals [tmp_opline -> op1 .constant ].cache_slot = op_array -> last_cache_slot ++ ;
82
- }
83
- }
84
- #else
85
- ZEND_OP1_LITERAL (tmp_opline ) = result ;
86
- #endif
87
- }
88
- /* TMP_VAR my be used only once */
89
- break ;
90
- }
91
- if (ZEND_OP2_TYPE (tmp_opline ) == IS_TMP_VAR &&
92
- ZEND_OP2 (tmp_opline ).var == tv ) {
93
- ZEND_OP2_TYPE (tmp_opline ) = IS_CONST ;
94
- #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
95
- tmp_opline -> op2 .constant = zend_optimizer_add_literal (op_array , & result TSRMLS_CC );
96
- if (Z_TYPE (result ) == IS_STRING ) {
97
- Z_HASH_P (& ZEND_OP2_LITERAL (tmp_opline )) = zend_hash_func (Z_STRVAL (ZEND_OP2_LITERAL (tmp_opline )), Z_STRLEN (ZEND_OP2_LITERAL (tmp_opline )) + 1 );
98
- if (tmp_opline -> opcode == ZEND_FETCH_R ||
99
- tmp_opline -> opcode == ZEND_FETCH_W ||
100
- tmp_opline -> opcode == ZEND_FETCH_RW ||
101
- tmp_opline -> opcode == ZEND_FETCH_IS ||
102
- tmp_opline -> opcode == ZEND_FETCH_UNSET ||
103
- tmp_opline -> opcode == ZEND_FETCH_FUNC_ARG ||
104
- tmp_opline -> opcode == ZEND_FETCH_CLASS ||
105
- tmp_opline -> opcode == ZEND_INIT_FCALL_BY_NAME ||
106
- tmp_opline -> opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
107
- tmp_opline -> opcode == ZEND_UNSET_VAR ||
108
- tmp_opline -> opcode == ZEND_ISSET_ISEMPTY_VAR ||
109
- tmp_opline -> opcode == ZEND_ADD_INTERFACE ||
110
- tmp_opline -> opcode == ZEND_ADD_TRAIT ) {
111
- op_array -> literals [tmp_opline -> op2 .constant ].cache_slot = op_array -> last_cache_slot ++ ;
112
- } else if (tmp_opline -> opcode == ZEND_INIT_METHOD_CALL ||
113
- tmp_opline -> opcode == ZEND_INIT_STATIC_METHOD_CALL ||
114
- tmp_opline -> opcode == ZEND_FETCH_CONSTANT ||
115
- tmp_opline -> opcode == ZEND_ASSIGN_OBJ ||
116
- tmp_opline -> opcode == ZEND_FETCH_OBJ_R ||
117
- tmp_opline -> opcode == ZEND_FETCH_OBJ_W ||
118
- tmp_opline -> opcode == ZEND_FETCH_OBJ_RW ||
119
- tmp_opline -> opcode == ZEND_FETCH_OBJ_IS ||
120
- tmp_opline -> opcode == ZEND_FETCH_OBJ_UNSET ||
121
- tmp_opline -> opcode == ZEND_FETCH_OBJ_FUNC_ARG ||
122
- tmp_opline -> opcode == ZEND_UNSET_OBJ ||
123
- tmp_opline -> opcode == ZEND_PRE_INC_OBJ ||
124
- tmp_opline -> opcode == ZEND_PRE_DEC_OBJ ||
125
- tmp_opline -> opcode == ZEND_POST_INC_OBJ ||
126
- tmp_opline -> opcode == ZEND_POST_DEC_OBJ ||
127
- tmp_opline -> opcode == ZEND_ISSET_ISEMPTY_PROP_OBJ ) {
128
- op_array -> literals [tmp_opline -> op2 .constant ].cache_slot = op_array -> last_cache_slot ;
129
- op_array -> last_cache_slot += 2 ;
130
- } else if (tmp_opline -> opcode == ZEND_ASSIGN_ADD ||
131
- tmp_opline -> opcode == ZEND_ASSIGN_SUB ||
132
- tmp_opline -> opcode == ZEND_ASSIGN_MUL ||
133
- tmp_opline -> opcode == ZEND_ASSIGN_DIV ||
134
- tmp_opline -> opcode == ZEND_ASSIGN_MOD ||
135
- tmp_opline -> opcode == ZEND_ASSIGN_SL ||
136
- tmp_opline -> opcode == ZEND_ASSIGN_SR ||
137
- tmp_opline -> opcode == ZEND_ASSIGN_CONCAT ||
138
- tmp_opline -> opcode == ZEND_ASSIGN_BW_OR ||
139
- tmp_opline -> opcode == ZEND_ASSIGN_BW_AND ||
140
- tmp_opline -> opcode == ZEND_ASSIGN_BW_XOR ) {
141
- if (tmp_opline -> extended_value == ZEND_ASSIGN_OBJ ) {
142
- op_array -> literals [tmp_opline -> op2 .constant ].cache_slot = op_array -> last_cache_slot ;
143
- op_array -> last_cache_slot += 2 ;
144
- }
145
- }
146
- }
147
- #else
148
- ZEND_OP2_LITERAL (tmp_opline ) = result ;
149
- #endif
150
- break ;
151
- }
152
- }
63
+ replace_tmp_by_const (op_array , opline + 1 , tv , & result TSRMLS_CC );
153
64
}
154
65
break ;
155
66
@@ -159,6 +70,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
159
70
opline -> extended_value != IS_OBJECT &&
160
71
opline -> extended_value != IS_RESOURCE ) {
161
72
/* cast of constant operand */
73
+ zend_uint tv = ZEND_RESULT (opline ).var ; /* temporary variable */
162
74
zval res ;
163
75
res = ZEND_OP1_LITERAL (opline );
164
76
zval_copy_ctor (& res );
@@ -179,11 +91,11 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
179
91
convert_to_string (& res );
180
92
break ;
181
93
}
94
+
182
95
literal_dtor (& ZEND_OP1_LITERAL (opline ));
183
- opline -> opcode = ZEND_QM_ASSIGN ;
184
- opline -> extended_value = 0 ;
185
- ZEND_OP1_LITERAL (opline ) = res ;
186
- SET_UNUSED (opline -> op2 );
96
+ MAKE_NOP (opline );
97
+
98
+ replace_tmp_by_const (op_array , opline + 1 , tv , & res TSRMLS_CC );
187
99
} else if (opline -> extended_value == IS_BOOL ) {
188
100
/* T = CAST(X, IS_BOOL) => T = BOOL(X) */
189
101
opline -> opcode = ZEND_BOOL ;
@@ -197,7 +109,6 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
197
109
/* unary operation on constant operand */
198
110
unary_op_type unary_op = get_unary_op (opline -> opcode );
199
111
zval result ;
200
- zend_op * tmp_opline ;
201
112
zend_uint tv = ZEND_RESULT (opline ).var ; /* temporary variable */
202
113
int er ;
203
114
@@ -218,34 +129,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
218
129
literal_dtor (& ZEND_OP1_LITERAL (opline ));
219
130
MAKE_NOP (opline );
220
131
221
- /* substitute the following TMP_VAR usage with constant */
222
- for (tmp_opline = opline + 1 ; tmp_opline < end ; tmp_opline ++ ) {
223
- if (ZEND_OP1_TYPE (tmp_opline ) == IS_TMP_VAR &&
224
- ZEND_OP1 (tmp_opline ).var == tv ) {
225
- if (tmp_opline -> opcode == ZEND_FREE ) {
226
- MAKE_NOP (tmp_opline );
227
- zval_dtor (& result );
228
- } else {
229
- ZEND_OP1_TYPE (tmp_opline ) = IS_CONST ;
230
- #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
231
- tmp_opline -> op1 .constant = zend_optimizer_add_literal (op_array , & result TSRMLS_CC );
232
- #else
233
- ZEND_OP1_LITERAL (tmp_opline ) = result ;
234
- #endif
235
- }
236
- break ;
237
- }
238
- if (ZEND_OP2_TYPE (tmp_opline ) == IS_TMP_VAR &&
239
- ZEND_OP2 (tmp_opline ).var == tv ) {
240
- ZEND_OP2_TYPE (tmp_opline ) = IS_CONST ;
241
- #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
242
- tmp_opline -> op2 .constant = zend_optimizer_add_literal (op_array , & result TSRMLS_CC );
243
- #else
244
- ZEND_OP2_LITERAL (tmp_opline ) = result ;
245
- #endif
246
- break ;
247
- }
248
- }
132
+ replace_tmp_by_const (op_array , opline + 1 , tv , & result TSRMLS_CC );
249
133
}
250
134
break ;
251
135
0 commit comments