summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2015-12-23 07:48:00 -0800
committerXinchen Hui <laruence@gmail.com>2015-12-23 07:48:00 -0800
commite21cb2daeabe459db996407df2113bb47a320937 (patch)
treebe269bf1257348e6cd221636eb89ab7a25ea0196 /ext
parent72207b5436a5d0ad66003cf494e098f8c067550b (diff)
downloadphp-git-e21cb2daeabe459db996407df2113bb47a320937.tar.gz
Fixed bug #71202 (Autoload function registered by another not activated immediately)
Diffstat (limited to 'ext')
-rw-r--r--ext/spl/php_spl.c11
-rw-r--r--ext/spl/tests/bug71202.phpt38
2 files changed, 47 insertions, 2 deletions
diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c
index e89caa2059..b2f59328d2 100644
--- a/ext/spl/php_spl.c
+++ b/ext/spl/php_spl.c
@@ -417,11 +417,17 @@ PHP_FUNCTION(spl_autoload_call)
}
if (SPL_G(autoload_functions)) {
+ HashPosition pos;
+ zend_ulong num_idx;
int l_autoload_running = SPL_G(autoload_running);
SPL_G(autoload_running) = 1;
lc_name = zend_string_alloc(Z_STRLEN_P(class_name), 0);
zend_str_tolower_copy(ZSTR_VAL(lc_name), Z_STRVAL_P(class_name), Z_STRLEN_P(class_name));
- ZEND_HASH_FOREACH_STR_KEY_PTR(SPL_G(autoload_functions), func_name, alfi) {
+ zend_hash_internal_pointer_reset_ex(SPL_G(autoload_functions), &pos);
+ while (zend_hash_get_current_key_ex(SPL_G(autoload_functions), &func_name, &num_idx, &pos) == HASH_KEY_IS_STRING) {
+ if ((alfi = zend_hash_get_current_data_ptr_ex(SPL_G(autoload_functions), &pos)) == NULL) {
+ continue;
+ }
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);
zend_exception_save();
if (retval) {
@@ -431,7 +437,8 @@ PHP_FUNCTION(spl_autoload_call)
if (zend_hash_exists(EG(class_table), lc_name)) {
break;
}
- } ZEND_HASH_FOREACH_END();
+ zend_hash_move_forward_ex(SPL_G(autoload_functions), &pos);
+ }
zend_exception_restore();
zend_string_free(lc_name);
SPL_G(autoload_running) = l_autoload_running;
diff --git a/ext/spl/tests/bug71202.phpt b/ext/spl/tests/bug71202.phpt
new file mode 100644
index 0000000000..d26d7e1f35
--- /dev/null
+++ b/ext/spl/tests/bug71202.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Bug #71202 (Autoload function registered by another not activated immediately)
+--FILE--
+<?php
+
+function inner_autoload ($name){
+ if ($name == 'A') {
+ class A {
+ function __construct(){
+ echo "okey, ";
+ }
+ }
+ } else {
+ class B {
+ function __construct() {
+ die("error");
+ }
+ }
+ }
+}
+
+spl_autoload_register(function ($name) {
+ if ($name == 'A') {
+ spl_autoload_register("inner_autoload");
+ } else {
+ spl_autoload_unregister("inner_autoload");
+ }
+});
+
+$c = new A();
+try {
+ $c = new B();
+} catch (Error $e) {
+ echo "done";
+}
+?>
+--EXPECT--
+okey, done