helly Wed Mar 2 19:20:58 2005 EDT Added files: /php-src/ext/spl/tests spl_autoload_002.phpt
Modified files: /php-src/ext/spl php_spl.c /php-src/ext/spl/tests spl_autoload_001.phpt Log: - Finish work on spl_autoload*() http://cvs.php.net/diff.php/php-src/ext/spl/php_spl.c?r1=1.42&r2=1.43&ty=u Index: php-src/ext/spl/php_spl.c diff -u php-src/ext/spl/php_spl.c:1.42 php-src/ext/spl/php_spl.c:1.43 --- php-src/ext/spl/php_spl.c:1.42 Wed Mar 2 15:59:05 2005 +++ php-src/ext/spl/php_spl.c Wed Mar 2 19:20:56 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_spl.c,v 1.42 2005/03/02 20:59:05 helly Exp $ */ +/* $Id: php_spl.c,v 1.43 2005/03/03 00:20:56 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -301,12 +301,12 @@ } /* }}} */ /* {{{ void spl_autoload_register([string autoload_function = "spl_autoload"]) - Register given function as __autoload() implementation*/ + Register given function as __autoload() implementation */ PHP_FUNCTION(spl_autoload_register) { char *func_name, *lc_name; int func_name_len; - zend_function *func_ptr, **func_ptr_ptr; + zend_function *spl_func_ptr, *func_ptr, **func_ptr_ptr; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &func_name, &func_name_len) == FAILURE) { return; @@ -315,6 +315,12 @@ if (ZEND_NUM_ARGS()) { lc_name = do_alloca(func_name_len + 1); zend_str_tolower_copy(lc_name, func_name, func_name_len); + + if (!strcmp(lc_name, "spl_autoload_call")) { + zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Function spl_autoload_call() cannot be registered", func_name); + free_alloca(lc_name); + return; + } if (zend_hash_find(EG(function_table), lc_name, func_name_len+1, (void **) &func_ptr) == FAILURE) { zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Function '%s' not found", func_name); @@ -327,6 +333,12 @@ zend_hash_init(SPL_G(autoload_functions), 1, NULL, NULL, 0); } + zend_hash_find(EG(function_table), "spl_autoload", sizeof("spl_autoload"), (void **) &spl_func_ptr); + + if (EG(autoload_func) == spl_func_ptr) { /* registered already, so we insert that first */ + zend_hash_add(SPL_G(autoload_functions), "spl_autoload", sizeof("spl_autoload"), &spl_func_ptr, sizeof(void*), (void**)&func_ptr_ptr); + } + zend_hash_add(SPL_G(autoload_functions), lc_name, func_name_len+1, &func_ptr, sizeof(void*), (void**)&func_ptr_ptr); free_alloca(lc_name); @@ -339,6 +351,81 @@ } } /* }}} */ +/* {{{ bool spl_autoload_unregister(string autoload_function) + Unregister given function as __autoload() implementation */ +PHP_FUNCTION(spl_autoload_unregister) +{ + char *func_name, *lc_name; + int func_name_len, success = FAILURE; + zend_function *spl_func_ptr; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &func_name, &func_name_len) == FAILURE) { + return; + } + + lc_name = do_alloca(func_name_len + 1); + zend_str_tolower_copy(lc_name, func_name, func_name_len); + + if (SPL_G(autoload_functions)) { + if (!strcmp(lc_name, "spl_autoload_call")) { + /* remove all */ + zend_hash_destroy(SPL_G(autoload_functions)); + FREE_HASHTABLE(SPL_G(autoload_functions)); + SPL_G(autoload_functions) = NULL; + EG(autoload_func) = NULL; + success = SUCCESS; + } else { + /* remove specific */ + success = zend_hash_del(SPL_G(autoload_functions), lc_name, func_name_len+1); + } + } else if (!strcmp(lc_name, "spl_autoload")) { + /* register single spl_autoload() */ + zend_hash_find(EG(function_table), "spl_autoload", sizeof("spl_autoload"), (void **) &spl_func_ptr); + + if (EG(autoload_func) == spl_func_ptr) { + success = SUCCESS; + EG(autoload_func) = NULL; + } + } + + free_alloca(lc_name); + + RETURN_BOOL(success == SUCCESS); +} /* }}} */ + +/* {{{ false|array spl_autoload_functions() + Return all registered __autoload() functionns */ +PHP_FUNCTION(spl_autoload_functions) +{ + zend_function *fptr, **func_ptr_ptr; + HashPosition function_pos; + + if (!EG(autoload_func)) { + if (zend_hash_find(EG(function_table), ZEND_AUTOLOAD_FUNC_NAME, sizeof(ZEND_AUTOLOAD_FUNC_NAME), (void **) &fptr) == SUCCESS) { + array_init(return_value); + add_next_index_stringl(return_value, ZEND_AUTOLOAD_FUNC_NAME, sizeof(ZEND_AUTOLOAD_FUNC_NAME)-1, 1); + return; + } + RETURN_FALSE; + } + + zend_hash_find(EG(function_table), "spl_autoload_call", sizeof("spl_autoload_call"), (void **) &fptr); + + if (EG(autoload_func) == fptr) { + array_init(return_value); + zend_hash_internal_pointer_reset_ex(SPL_G(autoload_functions), &function_pos); + while(zend_hash_has_more_elements_ex(SPL_G(autoload_functions), &function_pos) == SUCCESS) { + zend_hash_get_current_data_ex(SPL_G(autoload_functions), (void **) &func_ptr_ptr, &function_pos); + add_next_index_string(return_value, (*func_ptr_ptr)->common.function_name, 1); + zend_hash_move_forward_ex(SPL_G(autoload_functions), &function_pos); + } + return; + } + + array_init(return_value); + add_next_index_string(return_value, EG(autoload_func)->common.function_name, 1); +} /* }}} */ + int spl_build_class_list_string(zval **entry, char **list TSRMLS_DC) /* {{{ */ { char *res; @@ -388,6 +475,8 @@ PHP_FE(spl_autoload, NULL) PHP_FE(spl_autoload_extensions, NULL) PHP_FE(spl_autoload_register, NULL) + PHP_FE(spl_autoload_unregister, NULL) + PHP_FE(spl_autoload_functions, NULL) PHP_FE(spl_autoload_call, NULL) PHP_FE(class_parents, NULL) PHP_FE(class_implements, NULL) http://cvs.php.net/diff.php/php-src/ext/spl/tests/spl_autoload_001.phpt?r1=1.2&r2=1.3&ty=u Index: php-src/ext/spl/tests/spl_autoload_001.phpt diff -u php-src/ext/spl/tests/spl_autoload_001.phpt:1.2 php-src/ext/spl/tests/spl_autoload_001.phpt:1.3 --- php-src/ext/spl/tests/spl_autoload_001.phpt:1.2 Wed Mar 2 15:59:06 2005 +++ php-src/ext/spl/tests/spl_autoload_001.phpt Wed Mar 2 19:20:57 2005 @@ -69,6 +69,7 @@ echo "===REGISTER===\n"; +spl_autoload_unregister("spl_autoload"); spl_autoload_register("TestFunc1"); spl_autoload_register("TestFunc2"); spl_autoload_register("TestFunc2"); /* 2nd call ignored */ http://cvs.php.net/co.php/php-src/ext/spl/tests/spl_autoload_002.phpt?r=1.1&p=1 Index: php-src/ext/spl/tests/spl_autoload_002.phpt +++ php-src/ext/spl/tests/spl_autoload_002.phpt --TEST-- SPL: spl_autoloadfunctions() --SKIPIF-- <?php if (spl_autoload_functions() !== false) die('skip __autoload() registered by php.ini'); ?> --FILE-- <?php function SplAutoloadTest1($name) {} function SplAutoloadTest2($name) {} var_dump(spl_autoload_functions()); spl_autoload_register(); var_dump(spl_autoload_functions()); spl_autoload_register('SplAutoloadTest1'); spl_autoload_register('SplAutoloadTest2'); spl_autoload_register('SplAutoloadTest1'); var_dump(spl_autoload_functions()); spl_autoload_unregister('SplAutoloadTest1'); var_dump(spl_autoload_functions()); spl_autoload_unregister('spl_autoload_call'); var_dump(spl_autoload_functions()); spl_autoload_register(); var_dump(spl_autoload_functions()); spl_autoload_unregister('spl_autoload'); var_dump(spl_autoload_functions()); ?> ===DONE=== <?php exit(0); ?> --EXPECT-- bool(false) array(1) { [0]=> string(12) "spl_autoload" } array(3) { [0]=> string(12) "spl_autoload" [1]=> string(16) "SplAutoloadTest1" [2]=> string(16) "SplAutoloadTest2" } array(2) { [0]=> string(12) "spl_autoload" [1]=> string(16) "SplAutoloadTest2" } bool(false) array(1) { [0]=> string(12) "spl_autoload" } bool(false) ===DONE=== -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php