31
31
32
32
#define DEBUG_COMPACT_LITERALS 0
33
33
34
- #define LITERAL_VALUE 0x0100
35
- #define LITERAL_FUNC 0x0200
36
- #define LITERAL_CLASS 0x0300
37
- #define LITERAL_CONST 0x0400
38
- #define LITERAL_CLASS_CONST 0x0500
39
- #define LITERAL_STATIC_METHOD 0x0600
40
- #define LITERAL_STATIC_PROPERTY 0x0700
41
- #define LITERAL_METHOD 0x0800
42
- #define LITERAL_PROPERTY 0x0900
43
- #define LITERAL_GLOBAL 0x0A00
44
-
45
- #define LITERAL_KIND_MASK 0x0f00
46
- #define LITERAL_NUM_RELATED_MASK 0x000f
47
-
48
- #define LITERAL_NUM_RELATED (info ) (info & LITERAL_NUM_RELATED_MASK)
34
+ #define LITERAL_CLASS_CONST 1
35
+ #define LITERAL_STATIC_METHOD 2
36
+ #define LITERAL_STATIC_PROPERTY 3
49
37
50
38
typedef struct _literal_info {
51
- uint32_t flags ; /* bitmask (see defines above) */
39
+ uint8_t num_related ;
52
40
} literal_info ;
53
41
54
- #define LITERAL_INFO (n , kind , related ) do { \
55
- info[n].flags = ((kind) | ( related) ); \
42
+ #define LITERAL_INFO (n , related ) do { \
43
+ info[n].num_related = (related); \
56
44
} while (0)
57
45
58
46
static size_t type_num_classes (const zend_op_array * op_array , uint32_t arg_num )
@@ -112,10 +100,9 @@ static uint32_t add_static_slot(HashTable *hash,
112
100
return ret ;
113
101
}
114
102
115
- static zend_string * create_str_cache_key (zval * literal , uint32_t flags )
103
+ static zend_string * create_str_cache_key (zval * literal , uint8_t num_related )
116
104
{
117
105
ZEND_ASSERT (Z_TYPE_P (literal ) == IS_STRING );
118
- uint32_t num_related = LITERAL_NUM_RELATED (flags );
119
106
if (num_related == 1 ) {
120
107
return zend_string_copy (Z_STR_P (literal ));
121
108
}
@@ -167,49 +154,43 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
167
154
end = opline + op_array -> last ;
168
155
while (opline < end ) {
169
156
switch (opline -> opcode ) {
170
- case ZEND_INIT_FCALL :
171
- LITERAL_INFO (opline -> op2 .constant , LITERAL_FUNC , 1 );
172
- break ;
173
157
case ZEND_INIT_FCALL_BY_NAME :
174
- LITERAL_INFO (opline -> op2 .constant , LITERAL_FUNC , 2 );
158
+ LITERAL_INFO (opline -> op2 .constant , 2 );
175
159
break ;
176
160
case ZEND_INIT_NS_FCALL_BY_NAME :
177
- LITERAL_INFO (opline -> op2 .constant , LITERAL_FUNC , 3 );
161
+ LITERAL_INFO (opline -> op2 .constant , 3 );
178
162
break ;
179
163
case ZEND_INIT_METHOD_CALL :
180
164
if (opline -> op1_type == IS_CONST ) {
181
- LITERAL_INFO (opline -> op1 .constant , LITERAL_VALUE , 1 );
165
+ LITERAL_INFO (opline -> op1 .constant , 1 );
182
166
}
183
167
if (opline -> op2_type == IS_CONST ) {
184
- LITERAL_INFO (opline -> op2 .constant , LITERAL_METHOD , 2 );
168
+ LITERAL_INFO (opline -> op2 .constant , 2 );
185
169
}
186
170
break ;
187
171
case ZEND_INIT_STATIC_METHOD_CALL :
188
172
if (opline -> op1_type == IS_CONST ) {
189
- LITERAL_INFO (opline -> op1 .constant , LITERAL_CLASS , 2 );
173
+ LITERAL_INFO (opline -> op1 .constant , 2 );
190
174
}
191
175
if (opline -> op2_type == IS_CONST ) {
192
- LITERAL_INFO (opline -> op2 .constant , LITERAL_STATIC_METHOD , 2 );
176
+ LITERAL_INFO (opline -> op2 .constant , 2 );
193
177
}
194
178
break ;
195
179
case ZEND_CATCH :
196
- LITERAL_INFO (opline -> op1 .constant , LITERAL_CLASS , 2 );
197
- break ;
198
- case ZEND_DEFINED :
199
- LITERAL_INFO (opline -> op1 .constant , LITERAL_CONST , 1 );
180
+ LITERAL_INFO (opline -> op1 .constant , 2 );
200
181
break ;
201
182
case ZEND_FETCH_CONSTANT :
202
183
if (opline -> op1 .num & IS_CONSTANT_UNQUALIFIED_IN_NAMESPACE ) {
203
- LITERAL_INFO (opline -> op2 .constant , LITERAL_CONST , 3 );
184
+ LITERAL_INFO (opline -> op2 .constant , 3 );
204
185
} else {
205
- LITERAL_INFO (opline -> op2 .constant , LITERAL_CONST , 2 );
186
+ LITERAL_INFO (opline -> op2 .constant , 2 );
206
187
}
207
188
break ;
208
189
case ZEND_FETCH_CLASS_CONSTANT :
209
190
if (opline -> op1_type == IS_CONST ) {
210
- LITERAL_INFO (opline -> op1 .constant , LITERAL_CLASS , 2 );
191
+ LITERAL_INFO (opline -> op1 .constant , 2 );
211
192
}
212
- LITERAL_INFO (opline -> op2 .constant , LITERAL_CLASS_CONST , 1 );
193
+ LITERAL_INFO (opline -> op2 .constant , 1 );
213
194
break ;
214
195
case ZEND_ASSIGN_STATIC_PROP :
215
196
case ZEND_ASSIGN_STATIC_PROP_REF :
@@ -227,56 +208,28 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
227
208
case ZEND_POST_DEC_STATIC_PROP :
228
209
case ZEND_ASSIGN_STATIC_PROP_OP :
229
210
if (opline -> op2_type == IS_CONST ) {
230
- LITERAL_INFO (opline -> op2 .constant , LITERAL_CLASS , 2 );
211
+ LITERAL_INFO (opline -> op2 .constant , 2 );
231
212
}
232
213
if (opline -> op1_type == IS_CONST ) {
233
- LITERAL_INFO (opline -> op1 .constant , LITERAL_STATIC_PROPERTY , 1 );
214
+ LITERAL_INFO (opline -> op1 .constant , 1 );
234
215
}
235
216
break ;
236
217
case ZEND_FETCH_CLASS :
237
218
case ZEND_INSTANCEOF :
238
219
if (opline -> op2_type == IS_CONST ) {
239
- LITERAL_INFO (opline -> op2 .constant , LITERAL_CLASS , 2 );
220
+ LITERAL_INFO (opline -> op2 .constant , 2 );
240
221
}
241
222
break ;
242
223
case ZEND_NEW :
243
224
if (opline -> op1_type == IS_CONST ) {
244
- LITERAL_INFO (opline -> op1 .constant , LITERAL_CLASS , 2 );
245
- }
246
- break ;
247
- case ZEND_ASSIGN_OBJ :
248
- case ZEND_ASSIGN_OBJ_REF :
249
- case ZEND_FETCH_OBJ_R :
250
- case ZEND_FETCH_OBJ_W :
251
- case ZEND_FETCH_OBJ_RW :
252
- case ZEND_FETCH_OBJ_IS :
253
- case ZEND_FETCH_OBJ_UNSET :
254
- case ZEND_FETCH_OBJ_FUNC_ARG :
255
- case ZEND_UNSET_OBJ :
256
- case ZEND_PRE_INC_OBJ :
257
- case ZEND_PRE_DEC_OBJ :
258
- case ZEND_POST_INC_OBJ :
259
- case ZEND_POST_DEC_OBJ :
260
- case ZEND_ISSET_ISEMPTY_PROP_OBJ :
261
- case ZEND_ASSIGN_OBJ_OP :
262
- if (opline -> op1_type == IS_CONST ) {
263
- LITERAL_INFO (opline -> op1 .constant , LITERAL_VALUE , 1 );
264
- }
265
- if (opline -> op2_type == IS_CONST ) {
266
- LITERAL_INFO (opline -> op2 .constant , LITERAL_PROPERTY , 1 );
225
+ LITERAL_INFO (opline -> op1 .constant , 2 );
267
226
}
268
227
break ;
269
- case ZEND_BIND_GLOBAL :
270
- LITERAL_INFO (opline -> op2 .constant , LITERAL_GLOBAL , 1 );
271
- break ;
272
- case ZEND_RECV_INIT :
273
- LITERAL_INFO (opline -> op2 .constant , LITERAL_VALUE , 1 );
274
- break ;
275
228
case ZEND_DECLARE_CLASS :
276
229
case ZEND_DECLARE_CLASS_DELAYED :
277
- LITERAL_INFO (opline -> op1 .constant , LITERAL_VALUE , 2 );
230
+ LITERAL_INFO (opline -> op1 .constant , 2 );
278
231
if (opline -> op2_type == IS_CONST ) {
279
- LITERAL_INFO (opline -> op2 .constant , LITERAL_VALUE , 1 );
232
+ LITERAL_INFO (opline -> op2 .constant , 1 );
280
233
}
281
234
break ;
282
235
case ZEND_ISSET_ISEMPTY_DIM_OBJ :
@@ -292,22 +245,22 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
292
245
case ZEND_FETCH_LIST_W :
293
246
case ZEND_ASSIGN_DIM_OP :
294
247
if (opline -> op1_type == IS_CONST ) {
295
- LITERAL_INFO (opline -> op1 .constant , LITERAL_VALUE , 1 );
248
+ LITERAL_INFO (opline -> op1 .constant , 1 );
296
249
}
297
250
if (opline -> op2_type == IS_CONST ) {
298
251
if (Z_EXTRA (op_array -> literals [opline -> op2 .constant ]) == ZEND_EXTRA_VALUE ) {
299
- LITERAL_INFO (opline -> op2 .constant , LITERAL_VALUE , 2 );
252
+ LITERAL_INFO (opline -> op2 .constant , 2 );
300
253
} else {
301
- LITERAL_INFO (opline -> op2 .constant , LITERAL_VALUE , 1 );
254
+ LITERAL_INFO (opline -> op2 .constant , 1 );
302
255
}
303
256
}
304
257
break ;
305
258
default :
306
259
if (opline -> op1_type == IS_CONST ) {
307
- LITERAL_INFO (opline -> op1 .constant , LITERAL_VALUE , 1 );
260
+ LITERAL_INFO (opline -> op1 .constant , 1 );
308
261
}
309
262
if (opline -> op2_type == IS_CONST ) {
310
- LITERAL_INFO (opline -> op2 .constant , LITERAL_VALUE , 1 );
263
+ LITERAL_INFO (opline -> op2 .constant , 1 );
311
264
}
312
265
break ;
313
266
}
@@ -337,7 +290,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
337
290
map = (int * )zend_arena_alloc (& ctx -> arena , op_array -> last_literal * sizeof (int ));
338
291
memset (map , 0 , op_array -> last_literal * sizeof (int ));
339
292
for (i = 0 ; i < op_array -> last_literal ; i ++ ) {
340
- if (!info [i ].flags ) {
293
+ if (!info [i ].num_related ) {
341
294
/* unset literal */
342
295
zval_ptr_dtor_nogc (& op_array -> literals [i ]);
343
296
continue ;
@@ -377,7 +330,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
377
330
map [i ] = l_true ;
378
331
break ;
379
332
case IS_LONG :
380
- if (LITERAL_NUM_RELATED ( info [i ].flags ) == 1 ) {
333
+ if (info [i ].num_related == 1 ) {
381
334
if ((pos = zend_hash_index_find (& hash , Z_LVAL (op_array -> literals [i ]))) != NULL ) {
382
335
map [i ] = Z_LVAL_P (pos );
383
336
} else {
@@ -391,12 +344,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
391
344
j ++ ;
392
345
}
393
346
} else {
394
- ZEND_ASSERT (LITERAL_NUM_RELATED ( info [i ].flags ) == 2 );
347
+ ZEND_ASSERT (info [i ].num_related == 2 );
395
348
key = zend_string_init (Z_STRVAL (op_array -> literals [i + 1 ]), Z_STRLEN (op_array -> literals [i + 1 ]), 0 );
396
349
ZSTR_H (key ) = ZSTR_HASH (Z_STR (op_array -> literals [i + 1 ])) + 100 +
397
- LITERAL_NUM_RELATED ( info [i ].flags ) - 1 ;
350
+ info [i ].num_related - 1 ;
398
351
if ((pos = zend_hash_find (& hash , key )) != NULL
399
- && LITERAL_NUM_RELATED ( info [Z_LVAL_P (pos )].flags ) == 2 ) {
352
+ && info [Z_LVAL_P (pos )].num_related == 2 ) {
400
353
map [i ] = Z_LVAL_P (pos );
401
354
zval_ptr_dtor_nogc (& op_array -> literals [i + 1 ]);
402
355
} else {
@@ -430,14 +383,14 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
430
383
}
431
384
break ;
432
385
case IS_STRING : {
433
- key = create_str_cache_key (& op_array -> literals [i ], info [i ].flags );
386
+ key = create_str_cache_key (& op_array -> literals [i ], info [i ].num_related );
434
387
if ((pos = zend_hash_find (& hash , key )) != NULL ) {
435
388
ZEND_ASSERT (Z_TYPE (op_array -> literals [Z_LVAL_P (pos )]) == IS_STRING &&
436
- LITERAL_NUM_RELATED ( info [i ].flags ) == LITERAL_NUM_RELATED ( info [Z_LVAL_P (pos )].flags ) );
389
+ info [i ].num_related == info [Z_LVAL_P (pos )].num_related );
437
390
zend_string_release_ex (key , 0 );
438
391
map [i ] = Z_LVAL_P (pos );
439
392
zval_ptr_dtor_nogc (& op_array -> literals [i ]);
440
- n = LITERAL_NUM_RELATED ( info [i ].flags ) ;
393
+ n = info [i ].num_related ;
441
394
while (n > 1 ) {
442
395
i ++ ;
443
396
zval_ptr_dtor_nogc (& op_array -> literals [i ]);
@@ -455,7 +408,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
455
408
info [j ] = info [i ];
456
409
}
457
410
j ++ ;
458
- n = LITERAL_NUM_RELATED ( info [i ].flags ) ;
411
+ n = info [i ].num_related ;
459
412
while (n > 1 ) {
460
413
i ++ ;
461
414
if (i != j ) op_array -> literals [j ] = op_array -> literals [i ];
0 commit comments