@@ -401,6 +401,16 @@ static autoload_func_info *autoload_func_info_from_fci(
401401
402402static bool autoload_func_info_equals (
403403 const autoload_func_info * alfi1 , const autoload_func_info * alfi2 ) {
404+ if (UNEXPECTED (
405+ (alfi1 -> func_ptr -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE ) &&
406+ (alfi2 -> func_ptr -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE )
407+ )) {
408+ return alfi1 -> obj == alfi2 -> obj
409+ && alfi1 -> ce == alfi2 -> ce
410+ && alfi1 -> closure == alfi2 -> closure
411+ && zend_string_equals (alfi1 -> func_ptr -> common .function_name , alfi2 -> func_ptr -> common .function_name )
412+ ;
413+ }
404414 return alfi1 -> func_ptr == alfi2 -> func_ptr
405415 && alfi1 -> obj == alfi2 -> obj
406416 && alfi1 -> ce == alfi2 -> ce
@@ -580,6 +590,13 @@ PHP_FUNCTION(spl_autoload_unregister)
580590 RETURN_TRUE ;
581591 }
582592
593+ if (!fcc .function_handler ) {
594+ /* Call trampoline has been cleared by zpp. Refetch it, because we want to deal
595+ * with it outselves. It is important that it is not refetched on every call,
596+ * because calls may occur from different scopes. */
597+ zend_is_callable_ex (& fci .function_name , NULL , 0 , NULL , & fcc , NULL );
598+ }
599+
583600 autoload_func_info * alfi = autoload_func_info_from_fci (& fci , & fcc );
584601 Bucket * p = spl_find_registered_function (alfi );
585602 autoload_func_info_destroy (alfi );
0 commit comments