@@ -3959,7 +3959,7 @@ ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
3959
3959
ZEND_VM_NEXT_OPCODE ();
3960
3960
}
3961
3961
3962
- ZEND_VM_HOT_TYPE_SPEC_HANDLER (ZEND_INIT_FCALL , Z_TYPE_P (RT_CONSTANT (op , op -> op2 )) == IS_PTR , ZEND_INIT_FCALL_PTR , NUM , CONST , NUM |CACHE_SLOT )
3962
+ ZEND_VM_HOT_TYPE_SPEC_HANDLER (ZEND_INIT_FCALL , Z_TYPE_P (RT_CONSTANT (op , op -> op2 )) == IS_PTR && (( zend_function * ) Z_PTR_P ( RT_CONSTANT ( op , op -> op2 ))) -> common . type == ZEND_INTERNAL_FUNCTION , ZEND_INIT_FCALL_PTR_INTERNAL , NUM , CONST , NUM |CACHE_SLOT )
3963
3963
{
3964
3964
USE_OPLINE
3965
3965
zend_function * fbc ;
@@ -3975,6 +3975,26 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_INIT_FCALL, Z_TYPE_P(RT_CONSTANT(op, op->op2)
3975
3975
ZEND_VM_NEXT_OPCODE ();
3976
3976
}
3977
3977
3978
+ ZEND_VM_HOT_TYPE_SPEC_HANDLER (ZEND_INIT_FCALL , Z_TYPE_P (RT_CONSTANT (op , op -> op2 )) == IS_PTR && ((zend_function * )Z_PTR_P (RT_CONSTANT (op , op -> op2 )))-> common .type != ZEND_INTERNAL_FUNCTION , ZEND_INIT_FCALL_PTR_USER , NUM , CONST , NUM |CACHE_SLOT )
3979
+ {
3980
+ USE_OPLINE
3981
+ zend_function * fbc ;
3982
+ zend_execute_data * call ;
3983
+
3984
+ fbc = Z_PTR_P (RT_CONSTANT (opline , opline -> op2 ));
3985
+ if (UNEXPECTED (!RUN_TIME_CACHE (& fbc -> op_array ))) {
3986
+ init_func_run_time_cache (& fbc -> op_array );
3987
+ }
3988
+
3989
+ call = _zend_vm_stack_push_call_frame_ex (
3990
+ opline -> op1 .num , ZEND_CALL_NESTED_FUNCTION ,
3991
+ fbc , opline -> extended_value , NULL );
3992
+ call -> prev_execute_data = EX (call );
3993
+ EX (call ) = call ;
3994
+
3995
+ ZEND_VM_NEXT_OPCODE ();
3996
+ }
3997
+
3978
3998
ZEND_VM_HOT_HANDLER (129 , ZEND_DO_ICALL , ANY , ANY , SPEC (RETVAL ,OBSERVER ))
3979
3999
{
3980
4000
USE_OPLINE
0 commit comments