@@ -381,6 +381,11 @@ static void autoload_func_info_dtor(zval *element)
381
381
if (!Z_ISUNDEF (alfi -> closure )) {
382
382
zval_ptr_dtor (& alfi -> closure );
383
383
}
384
+ if (alfi -> func_ptr &&
385
+ UNEXPECTED (alfi -> func_ptr -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE )) {
386
+ zend_string_release (alfi -> func_ptr -> common .function_name );
387
+ zend_free_trampoline (alfi -> func_ptr );
388
+ }
384
389
efree (alfi );
385
390
}
386
391
@@ -406,7 +411,15 @@ PHP_FUNCTION(spl_autoload_call)
406
411
zend_hash_internal_pointer_reset_ex (SPL_G (autoload_functions ), & pos );
407
412
while (zend_hash_get_current_key_ex (SPL_G (autoload_functions ), & func_name , & num_idx , & pos ) == HASH_KEY_IS_STRING ) {
408
413
alfi = zend_hash_get_current_data_ptr_ex (SPL_G (autoload_functions ), & pos );
409
- zend_call_method (Z_ISUNDEF (alfi -> obj )? NULL : & alfi -> obj , alfi -> ce , & alfi -> func_ptr , ZSTR_VAL (func_name ), ZSTR_LEN (func_name ), retval , 1 , class_name , NULL );
414
+ if (UNEXPECTED (alfi -> func_ptr -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE )) {
415
+ zend_function * copy = emalloc (sizeof (zend_op_array ));
416
+
417
+ memcpy (copy , alfi -> func_ptr , sizeof (zend_op_array ));
418
+ copy -> op_array .function_name = zend_string_copy (alfi -> func_ptr -> op_array .function_name );
419
+ zend_call_method (Z_ISUNDEF (alfi -> obj )? NULL : & alfi -> obj , alfi -> ce , & copy , ZSTR_VAL (func_name ), ZSTR_LEN (func_name ), retval , 1 , class_name , NULL );
420
+ } else {
421
+ zend_call_method (Z_ISUNDEF (alfi -> obj )? NULL : & alfi -> obj , alfi -> ce , & alfi -> func_ptr , ZSTR_VAL (func_name ), ZSTR_LEN (func_name ), retval , 1 , class_name , NULL );
422
+ }
410
423
zend_exception_save ();
411
424
if (retval ) {
412
425
zval_ptr_dtor (retval );
@@ -568,13 +581,24 @@ PHP_FUNCTION(spl_autoload_register)
568
581
}
569
582
}
570
583
584
+ if (UNEXPECTED (alfi .func_ptr == & EG (trampoline ))) {
585
+ zend_function * copy = emalloc (sizeof (zend_op_array ));
586
+
587
+ memcpy (copy , alfi .func_ptr , sizeof (zend_op_array ));
588
+ alfi .func_ptr -> common .function_name = NULL ;
589
+ alfi .func_ptr = copy ;
590
+ }
571
591
if (zend_hash_add_mem (SPL_G (autoload_functions ), lc_name , & alfi , sizeof (autoload_func_info )) == NULL ) {
572
592
if (obj_ptr && !(alfi .func_ptr -> common .fn_flags & ZEND_ACC_STATIC )) {
573
593
Z_DELREF (alfi .obj );
574
594
}
575
595
if (!Z_ISUNDEF (alfi .closure )) {
576
596
Z_DELREF (alfi .closure );
577
597
}
598
+ if (UNEXPECTED (alfi .func_ptr -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE )) {
599
+ zend_string_release (alfi .func_ptr -> common .function_name );
600
+ zend_free_trampoline (alfi .func_ptr );
601
+ }
578
602
}
579
603
if (prepend && SPL_G (autoload_functions )-> nNumOfElements > 1 ) {
580
604
/* Move the newly created element to the head of the hashtable */
0 commit comments