]> granicus.if.org Git - php/commitdiff
MFH: Fix #48023 (spl_autoload_register didn't store closures)
authorEtienne Kneuss <colder@php.net>
Mon, 20 Apr 2009 14:20:20 +0000 (14:20 +0000)
committerEtienne Kneuss <colder@php.net>
Mon, 20 Apr 2009 14:20:20 +0000 (14:20 +0000)
NEWS
ext/spl/php_spl.c
ext/spl/tests/bug48023.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index effe52f532a3a3466494cf0c38aa6156a356ef6d..afa651a08dd65087868a53069d312c0580ac97ab 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,7 @@ PHP                                                                        NEWS
   disable this behaviour using "http"=>array("auto_decode"=>0) in stream
   context. (Dmitry)
 
+- Fixed bug #48023 (spl_autoload_register didn't store closures). (Etienne)
 - Fixed bug #47880 (crashes in call_user_func_array()). (Dmitry)
 - Fixed bug #47856 (stristr() converts needle to lower-case). (Ilia)
 - Fixed bug #47851 (is_callable throws fatal error). (Dmitry)
index 0406bb4414dca42f885ae48ad3430a14a794cc30..dda04cbd0171261c3e68c0d94b2d829ab8591e4b 100755 (executable)
@@ -353,6 +353,7 @@ PHP_FUNCTION(spl_autoload_extensions)
 typedef struct {
        zend_function *func_ptr;
        zval *obj;
+       zval *closure;
        zend_class_entry *ce;
 } autoload_func_info;
 
@@ -361,6 +362,9 @@ static void autoload_func_info_dtor(autoload_func_info *alfi)
        if (alfi->obj) {
                zval_ptr_dtor(&alfi->obj);
        }
+       if (alfi->closure) {
+               zval_ptr_dtor(&alfi->closure);
+       }
 }
 
 /* {{{ proto void spl_autoload_call(string class_name)
@@ -488,9 +492,14 @@ PHP_FUNCTION(spl_autoload_register)
                                RETURN_FALSE;
                        }
                }
+               alfi.closure = NULL;
                alfi.ce = fcc.calling_scope;
                alfi.func_ptr = fcc.function_handler;
                obj_ptr = fcc.object_ptr;
+               if (Z_TYPE_P(zcallable) == IS_OBJECT) {
+                       alfi.closure = zcallable;
+                       Z_ADDREF_P(zcallable);
+               }
                if (error) {
                        efree(error);
                }
@@ -527,6 +536,7 @@ PHP_FUNCTION(spl_autoload_register)
                        spl_alfi.func_ptr = spl_func_ptr;
                        spl_alfi.obj = NULL;
                        spl_alfi.ce = NULL;
+                       spl_alfi.closure = NULL;
                        zend_hash_add(SPL_G(autoload_functions), "spl_autoload", sizeof("spl_autoload"), &spl_alfi, sizeof(autoload_func_info), NULL);
                        if (prepend && SPL_G(autoload_functions)->nNumOfElements > 1) {
                                /* Move the newly created element to the head of the hashtable */
diff --git a/ext/spl/tests/bug48023.phpt b/ext/spl/tests/bug48023.phpt
new file mode 100644 (file)
index 0000000..ed0ff9e
--- /dev/null
@@ -0,0 +1,12 @@
+--TEST--
+Bug #48023 (spl_autoload_register didn't addref closures)
+--FILE--
+<?php
+spl_autoload_register(function(){});
+
+new Foo;
+
+?>
+===DONE===
+--EXPECTF--
+Fatal error: Class 'Foo' not found in %s on line %d