colder          Mon Apr 20 14:20:20 2009 UTC

  Added files:                 (Branch: PHP_5_3)
    /php-src/ext/spl/tests      bug48023.phpt 

  Modified files:              
    /php-src/ext/spl    php_spl.c 
    /php-src    NEWS 
  Log:
  MFH: Fix #48023 (spl_autoload_register didn't store closures)
  
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/php_spl.c?r1=1.52.2.28.2.17.2.35&r2=1.52.2.28.2.17.2.36&diff_format=u
Index: php-src/ext/spl/php_spl.c
diff -u php-src/ext/spl/php_spl.c:1.52.2.28.2.17.2.35 
php-src/ext/spl/php_spl.c:1.52.2.28.2.17.2.36
--- php-src/ext/spl/php_spl.c:1.52.2.28.2.17.2.35       Mon Jan 26 11:38:03 2009
+++ php-src/ext/spl/php_spl.c   Mon Apr 20 14:20:20 2009
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_spl.c,v 1.52.2.28.2.17.2.35 2009/01/26 11:38:03 colder Exp $ */
+/* $Id: php_spl.c,v 1.52.2.28.2.17.2.36 2009/04/20 14:20:20 colder Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -353,6 +353,7 @@
 typedef struct {
        zend_function *func_ptr;
        zval *obj;
+       zval *closure;
        zend_class_entry *ce;
 } autoload_func_info;
 
@@ -361,6 +362,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)
@@ -488,9 +492,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);
                }
@@ -527,6 +536,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/NEWS?r1=1.2027.2.547.2.965.2.564&r2=1.2027.2.547.2.965.2.565&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.564 
php-src/NEWS:1.2027.2.547.2.965.2.565
--- php-src/NEWS:1.2027.2.547.2.965.2.564       Mon Apr 20 14:08:43 2009
+++ php-src/NEWS        Mon Apr 20 14:20:20 2009
@@ -12,6 +12,7 @@
   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)

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

Reply via email to