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