@@ -379,14 +379,22 @@ PHP_FUNCTION(spl_autoload_call)
379379
380380 if (SPL_G (autoload_functions )) {
381381 int l_autoload_running = SPL_G (autoload_running );
382+ zval * exception = NULL ;
382383 SPL_G (autoload_running ) = 1 ;
383384 class_name_len = Z_STRLEN_P (class_name );
384385 lc_name = zend_str_tolower_dup (Z_STRVAL_P (class_name ), class_name_len );
385386 zend_hash_internal_pointer_reset_ex (SPL_G (autoload_functions ), & function_pos );
386- while (zend_hash_has_more_elements_ex (SPL_G (autoload_functions ), & function_pos ) == SUCCESS && ! EG ( exception ) ) {
387+ while (zend_hash_has_more_elements_ex (SPL_G (autoload_functions ), & function_pos ) == SUCCESS ) {
387388 zend_hash_get_current_key_ex (SPL_G (autoload_functions ), & func_name , & func_name_len , & dummy , 0 , & function_pos );
388389 zend_hash_get_current_data_ex (SPL_G (autoload_functions ), (void * * ) & alfi , & function_pos );
389390 zend_call_method (alfi -> obj ? & alfi -> obj : NULL , alfi -> ce , & alfi -> func_ptr , func_name , func_name_len , & retval , 1 , class_name , NULL TSRMLS_CC );
391+ if (EG (exception )) {
392+ if (exception ) {
393+ zend_update_property (zend_exception_get_default (TSRMLS_C ), EG (exception ), "previous" , sizeof ("previous" )- 1 , exception TSRMLS_CC );
394+ }
395+ exception = EG (exception );
396+ EG (exception ) = NULL ;
397+ }
390398 if (retval ) {
391399 zval_ptr_dtor (& retval );
392400 }
@@ -395,6 +403,7 @@ PHP_FUNCTION(spl_autoload_call)
395403 }
396404 zend_hash_move_forward_ex (SPL_G (autoload_functions ), & function_pos );
397405 }
406+ EG (exception ) = exception ;
398407 efree (lc_name );
399408 SPL_G (autoload_running ) = l_autoload_running ;
400409 } else {
0 commit comments