@@ -165,7 +165,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
165165	HashTable  hash ;
166166	zend_string  * key  =  NULL ;
167167	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 ;
169169
170170	if  (op_array -> last_literal ) {
171171		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
175175		end  =  opline  +  op_array -> last ;
176176		while  (opline  <  end ) {
177177			switch  (opline -> opcode ) {
178+ 				case  ZEND_JMP_FRAMELESS :
179+ 					LITERAL_INFO (opline -> op1 .constant , 1 );
180+ 					break ;
178181				case  ZEND_INIT_FCALL_BY_NAME :
179182					LITERAL_INFO (opline -> op2 .constant , 2 );
180183					break ;
@@ -480,13 +483,14 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
480483		zend_hash_clean (& hash );
481484		op_array -> last_literal  =  j ;
482485
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 ));
485488		class_slot  =  const_slot  +  j ;
486489		func_slot  =  class_slot  +  j ;
487490		bind_var_slot  =  func_slot  +  j ;
488491		property_slot  =  bind_var_slot  +  j ;
489492		method_slot  =  property_slot  +  j ;
493+ 		jmp_slot  =  method_slot  +  j ;
490494
491495		/* Update opcodes to use new literals table */ 
492496		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
773777					break ;
774778				case  ZEND_DECLARE_ANON_CLASS :
775779				case  ZEND_DECLARE_CLASS_DELAYED :
776- 				case  ZEND_JMP_FRAMELESS :
777780					opline -> extended_value  =  cache_size ;
778781					cache_size  +=  sizeof (void  * );
779782					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 ;
780793				case  ZEND_SEND_VAL :
781794				case  ZEND_SEND_VAL_EX :
782795				case  ZEND_SEND_VAR :
0 commit comments