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