summaryrefslogtreecommitdiff
path: root/ext/spl/php_spl.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2008-07-12 14:58:41 +0000
committerMarcus Boerger <helly@php.net>2008-07-12 14:58:41 +0000
commite4869828a7905af350afe1870c64651578497a6c (patch)
tree444e5d5bda032678969190949d75860082781c48 /ext/spl/php_spl.c
parent61a808dfa9fc79f14c76ab90bd14254b7bfd00b3 (diff)
downloadphp-git-e4869828a7905af350afe1870c64651578497a6c.tar.gz
- MFH Allow multiple exceptions in spl's autoload
Diffstat (limited to 'ext/spl/php_spl.c')
-rwxr-xr-xext/spl/php_spl.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c
index 40612c126c..a8404314c1 100755
--- a/ext/spl/php_spl.c
+++ b/ext/spl/php_spl.c
@@ -379,14 +379,22 @@ PHP_FUNCTION(spl_autoload_call)
if (SPL_G(autoload_functions)) {
int l_autoload_running = SPL_G(autoload_running);
+ zval *exception = NULL;
SPL_G(autoload_running) = 1;
class_name_len = Z_STRLEN_P(class_name);
lc_name = zend_str_tolower_dup(Z_STRVAL_P(class_name), class_name_len);
zend_hash_internal_pointer_reset_ex(SPL_G(autoload_functions), &function_pos);
- while(zend_hash_has_more_elements_ex(SPL_G(autoload_functions), &function_pos) == SUCCESS && !EG(exception)) {
+ while(zend_hash_has_more_elements_ex(SPL_G(autoload_functions), &function_pos) == SUCCESS) {
zend_hash_get_current_key_ex(SPL_G(autoload_functions), &func_name, &func_name_len, &dummy, 0, &function_pos);
zend_hash_get_current_data_ex(SPL_G(autoload_functions), (void **) &alfi, &function_pos);
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);
+ if (EG(exception)) {
+ if (exception) {
+ zend_update_property(zend_exception_get_default(TSRMLS_C), EG(exception), "previous", sizeof("previous")-1, exception TSRMLS_CC);
+ }
+ exception = EG(exception);
+ EG(exception) = NULL;
+ }
if (retval) {
zval_ptr_dtor(&retval);
}
@@ -395,6 +403,7 @@ PHP_FUNCTION(spl_autoload_call)
}
zend_hash_move_forward_ex(SPL_G(autoload_functions), &function_pos);
}
+ EG(exception) = exception;
efree(lc_name);
SPL_G(autoload_running) = l_autoload_running;
} else {