@@ -165,7 +165,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
165
165
HashTable hash ;
166
166
zend_string * key = NULL ;
167
167
void * checkpoint = zend_arena_checkpoint (ctx -> arena );
168
- int * const_slot , * class_slot , * func_slot , * bind_var_slot , * property_slot , * method_slot ;
168
+ int * const_slot , * class_slot , * func_slot , * bind_var_slot , * property_slot , * method_slot , * jmp_slot ;
169
169
170
170
if (op_array -> last_literal ) {
171
171
info = (literal_info * )zend_arena_calloc (& ctx -> arena , op_array -> last_literal , sizeof (literal_info ));
@@ -175,6 +175,9 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
175
175
end = opline + op_array -> last ;
176
176
while (opline < end ) {
177
177
switch (opline -> opcode ) {
178
+ case ZEND_JMP_FRAMELESS :
179
+ LITERAL_INFO (opline -> op1 .constant , 1 );
180
+ break ;
178
181
case ZEND_INIT_FCALL_BY_NAME :
179
182
LITERAL_INFO (opline -> op2 .constant , 2 );
180
183
break ;
@@ -480,13 +483,14 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
480
483
zend_hash_clean (& hash );
481
484
op_array -> last_literal = j ;
482
485
483
- const_slot = zend_arena_alloc (& ctx -> arena , j * 6 * sizeof (int ));
484
- memset (const_slot , -1 , j * 6 * sizeof (int ));
486
+ const_slot = zend_arena_alloc (& ctx -> arena , j * 7 * sizeof (int ));
487
+ memset (const_slot , -1 , j * 7 * sizeof (int ));
485
488
class_slot = const_slot + j ;
486
489
func_slot = class_slot + j ;
487
490
bind_var_slot = func_slot + j ;
488
491
property_slot = bind_var_slot + j ;
489
492
method_slot = property_slot + j ;
493
+ jmp_slot = method_slot + j ;
490
494
491
495
/* Update opcodes to use new literals table */
492
496
cache_size = zend_op_array_extension_handles * sizeof (void * );
@@ -773,10 +777,19 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
773
777
break ;
774
778
case ZEND_DECLARE_ANON_CLASS :
775
779
case ZEND_DECLARE_CLASS_DELAYED :
776
- case ZEND_JMP_FRAMELESS :
777
780
opline -> extended_value = cache_size ;
778
781
cache_size += sizeof (void * );
779
782
break ;
783
+ case ZEND_JMP_FRAMELESS :
784
+ // op1 func
785
+ if (jmp_slot [opline -> op1 .constant ] >= 0 ) {
786
+ opline -> extended_value = jmp_slot [opline -> op1 .constant ];
787
+ } else {
788
+ opline -> extended_value = cache_size ;
789
+ cache_size += sizeof (void * );
790
+ jmp_slot [opline -> op1 .constant ] = opline -> extended_value ;
791
+ }
792
+ break ;
780
793
case ZEND_SEND_VAL :
781
794
case ZEND_SEND_VAL_EX :
782
795
case ZEND_SEND_VAR :
0 commit comments