colder Mon Apr 20 14:18:46 2009 UTC Added files: /php-src/ext/spl/tests bug48023.phpt
Modified files: /php-src/ext/spl php_spl.c Log: Fix #48023 (spl_autoload_register didn't store closures) http://cvs.php.net/viewvc.cgi/php-src/ext/spl/php_spl.c?r1=1.152&r2=1.153&diff_format=u Index: php-src/ext/spl/php_spl.c diff -u php-src/ext/spl/php_spl.c:1.152 php-src/ext/spl/php_spl.c:1.153 --- php-src/ext/spl/php_spl.c:1.152 Thu Mar 26 20:02:12 2009 +++ php-src/ext/spl/php_spl.c Mon Apr 20 14:18:46 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_spl.c,v 1.152 2009/03/26 20:02:12 felipe Exp $ */ +/* $Id: php_spl.c,v 1.153 2009/04/20 14:18:46 colder Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -337,6 +337,7 @@ typedef struct { zend_function *func_ptr; zval *obj; + zval *closure; zend_class_entry *ce; } autoload_func_info; @@ -345,6 +346,9 @@ if (alfi->obj) { zval_ptr_dtor(&alfi->obj); } + if (alfi->closure) { + zval_ptr_dtor(&alfi->closure); + } } /* {{{ proto void spl_autoload_call(string class_name) U @@ -485,9 +489,14 @@ 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); } @@ -531,6 +540,7 @@ 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 */ http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/bug48023.phpt?view=markup&rev=1.1 Index: php-src/ext/spl/tests/bug48023.phpt +++ php-src/ext/spl/tests/bug48023.phpt --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 -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php