@@ -368,16 +368,16 @@ PHP_FUNCTION(spl_autoload_extensions)
368
368
369
369
typedef struct {
370
370
zend_function * func_ptr ;
371
- zval obj ;
371
+ zend_object * obj ;
372
372
zval closure ;
373
373
zend_class_entry * ce ;
374
374
} autoload_func_info ;
375
375
376
376
static void autoload_func_info_dtor (zval * element )
377
377
{
378
378
autoload_func_info * alfi = (autoload_func_info * )Z_PTR_P (element );
379
- if (! Z_ISUNDEF ( alfi -> obj ) ) {
380
- zval_ptr_dtor ( & alfi -> obj );
379
+ if (alfi -> obj ) {
380
+ zend_object_release ( alfi -> obj );
381
381
}
382
382
if (alfi -> func_ptr &&
383
383
UNEXPECTED (alfi -> func_ptr -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE )) {
@@ -395,51 +395,27 @@ static zend_class_entry *spl_perform_autoload(zend_string *class_name, zend_stri
395
395
return NULL ;
396
396
}
397
397
398
- HashPosition pos ;
399
- zend_ulong num_idx ;
400
- zend_function * func ;
401
- zend_fcall_info fci ;
402
- zend_fcall_info_cache fcic ;
403
- zval params [1 ];
404
- zval retval ;
405
- zend_string * func_name ;
406
-
407
- fci .size = sizeof (fci );
408
- fci .retval = & retval ;
409
- fci .param_count = 1 ;
410
- fci .params = params ;
411
- fci .no_separation = 1 ;
412
- ZVAL_STR (& params [0 ], class_name );
413
-
414
- ZVAL_UNDEF (& fci .function_name ); /* Unused */
415
-
416
398
/* We don't use ZEND_HASH_FOREACH here,
417
399
* because autoloaders may be added/removed during autoloading. */
400
+ HashPosition pos ;
418
401
zend_hash_internal_pointer_reset_ex (SPL_G (autoload_functions ), & pos );
419
- while (zend_hash_get_current_key_ex ( SPL_G ( autoload_functions ), & func_name , & num_idx , & pos ) == HASH_KEY_IS_STRING ) {
402
+ while (1 ) {
420
403
autoload_func_info * alfi =
421
404
zend_hash_get_current_data_ptr_ex (SPL_G (autoload_functions ), & pos );
422
- func = alfi -> func_ptr ;
405
+ if (!alfi ) {
406
+ break ;
407
+ }
408
+
409
+ zend_function * func = alfi -> func_ptr ;
423
410
if (UNEXPECTED (func -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE )) {
424
411
func = emalloc (sizeof (zend_op_array ));
425
412
memcpy (func , alfi -> func_ptr , sizeof (zend_op_array ));
426
413
zend_string_addref (func -> op_array .function_name );
427
414
}
428
- ZVAL_UNDEF (& retval );
429
- fcic .function_handler = func ;
430
- if (Z_ISUNDEF (alfi -> obj )) {
431
- fci .object = NULL ;
432
- fcic .object = NULL ;
433
- fcic .called_scope = alfi -> ce ;
434
- } else {
435
- fci .object = Z_OBJ (alfi -> obj );
436
- fcic .object = Z_OBJ (alfi -> obj );
437
- fcic .called_scope = Z_OBJCE (alfi -> obj );
438
- }
439
-
440
- zend_call_function (& fci , & fcic );
441
- zval_ptr_dtor (& retval );
442
415
416
+ zval param ;
417
+ ZVAL_STR (& param , class_name );
418
+ zend_call_known_function (func , alfi -> obj , alfi -> ce , NULL , 1 , & param );
443
419
if (EG (exception )) {
444
420
break ;
445
421
}
@@ -487,7 +463,6 @@ PHP_FUNCTION(spl_autoload_register)
487
463
zend_bool do_throw = 1 ;
488
464
zend_bool prepend = 0 ;
489
465
autoload_func_info alfi ;
490
- zend_object * obj_ptr ;
491
466
zend_fcall_info fci = {0 };
492
467
zend_fcall_info_cache fcc ;
493
468
@@ -512,7 +487,7 @@ PHP_FUNCTION(spl_autoload_register)
512
487
if (ZEND_FCI_INITIALIZED (fci )) {
513
488
alfi .ce = fcc .calling_scope ;
514
489
alfi .func_ptr = fcc .function_handler ;
515
- obj_ptr = fcc .object ;
490
+ alfi . obj = !( alfi . func_ptr -> common . fn_flags & ZEND_ACC_STATIC ) ? fcc .object : NULL ;
516
491
517
492
if (fcc .function_handler -> type == ZEND_INTERNAL_FUNCTION &&
518
493
fcc .function_handler -> internal_function .handler == zif_spl_autoload_call ) {
@@ -547,15 +522,12 @@ PHP_FUNCTION(spl_autoload_register)
547
522
goto skip ;
548
523
}
549
524
550
- if (obj_ptr && !( alfi .func_ptr -> common . fn_flags & ZEND_ACC_STATIC ) ) {
525
+ if (alfi .obj ) {
551
526
/* add object id to the hash to ensure uniqueness, for more reference look at bug #40091 */
552
527
lc_name = zend_string_extend (lc_name , ZSTR_LEN (lc_name ) + sizeof (uint32_t ), 0 );
553
- memcpy (ZSTR_VAL (lc_name ) + ZSTR_LEN (lc_name ) - sizeof (uint32_t ), & obj_ptr -> handle , sizeof (uint32_t ));
528
+ memcpy (ZSTR_VAL (lc_name ) + ZSTR_LEN (lc_name ) - sizeof (uint32_t ), & alfi . obj -> handle , sizeof (uint32_t ));
554
529
ZSTR_VAL (lc_name )[ZSTR_LEN (lc_name )] = '\0' ;
555
- ZVAL_OBJ (& alfi .obj , obj_ptr );
556
- Z_ADDREF (alfi .obj );
557
- } else {
558
- ZVAL_UNDEF (& alfi .obj );
530
+ GC_ADDREF (alfi .obj );
559
531
}
560
532
561
533
if (UNEXPECTED (alfi .func_ptr == & EG (trampoline ))) {
@@ -566,8 +538,8 @@ PHP_FUNCTION(spl_autoload_register)
566
538
alfi .func_ptr = copy ;
567
539
}
568
540
if (zend_hash_add_mem (SPL_G (autoload_functions ), lc_name , & alfi , sizeof (autoload_func_info )) == NULL ) {
569
- if (obj_ptr && !(alfi .func_ptr -> common .fn_flags & ZEND_ACC_STATIC )) {
570
- Z_DELREF (alfi .obj );
541
+ if (alfi . obj && !(alfi .func_ptr -> common .fn_flags & ZEND_ACC_STATIC )) {
542
+ GC_DELREF (alfi .obj );
571
543
}
572
544
if (!Z_ISUNDEF (alfi .closure )) {
573
545
Z_DELREF (alfi .closure );
@@ -587,9 +559,9 @@ PHP_FUNCTION(spl_autoload_register)
587
559
autoload_func_info spl_alfi ;
588
560
spl_alfi .func_ptr = zend_hash_str_find_ptr (
589
561
CG (function_table ), "spl_autoload" , sizeof ("spl_autoload" ) - 1 );
590
- ZVAL_UNDEF (& spl_alfi .obj );
591
- ZVAL_UNDEF (& spl_alfi .closure );
562
+ spl_alfi .obj = NULL ;
592
563
spl_alfi .ce = NULL ;
564
+ ZVAL_UNDEF (& spl_alfi .closure );
593
565
zend_hash_add_mem (SPL_G (autoload_functions ), spl_alfi .func_ptr -> common .function_name ,
594
566
& spl_alfi , sizeof (autoload_func_info ));
595
567
if (prepend && SPL_G (autoload_functions )-> nNumOfElements > 1 ) {
@@ -689,9 +661,11 @@ PHP_FUNCTION(spl_autoload_functions)
689
661
zval tmp ;
690
662
691
663
array_init (& tmp );
692
- if (!Z_ISUNDEF (alfi -> obj )) {
693
- Z_ADDREF (alfi -> obj );
694
- add_next_index_zval (& tmp , & alfi -> obj );
664
+ if (alfi -> obj ) {
665
+ zval obj_zv ;
666
+ ZVAL_OBJ (& obj_zv , alfi -> obj );
667
+ Z_ADDREF (obj_zv );
668
+ add_next_index_zval (& tmp , & obj_zv );
695
669
} else {
696
670
add_next_index_str (& tmp , zend_string_copy (alfi -> ce -> name ));
697
671
}
0 commit comments