andrei Thu Jul 20 23:21:33 2006 UTC Modified files: /php-src unicode-progress.txt /php-src/ext/standard array.c basic_functions.c basic_functions.h Log: Make array_walk(_recursive) use params API with FCI cache and mark them with U.
http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.28&r2=1.29&diff_format=u Index: php-src/unicode-progress.txt diff -u php-src/unicode-progress.txt:1.28 php-src/unicode-progress.txt:1.29 --- php-src/unicode-progress.txt:1.28 Thu Jul 20 22:51:20 2006 +++ php-src/unicode-progress.txt Thu Jul 20 23:21:32 2006 @@ -11,7 +11,8 @@ directly in code point order array_intersect(), array_uintersect() - array_intersect_assoc(), array_uintersect_assoc(), array_intersect_uassoc(), array_uintersect_uassoc() + array_intersect_assoc(), array_uintersect_assoc() + array_intersect_uassoc(), array_uintersect_uassoc() array_intersect_key(), array_intersect_ukey() Should work with minor cleanups provided that underlying comparison functions are fixed, FCI cache, test @@ -19,12 +20,6 @@ array_multisort() Add SORT_LOCALE_STRING, test - array_walk() - Params API, is_callable check, FCI cache, test - - array_walk_recursive() - Params API, is_callable check, FCI cache, test - extract() Params API, fix php_valid_var_name(), test @@ -62,6 +57,8 @@ array_sum() array_values() array_unique() + array_walk() + array_walk_recursive() compact() count() in_array() http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.370&r2=1.371&diff_format=u Index: php-src/ext/standard/array.c diff -u php-src/ext/standard/array.c:1.370 php-src/ext/standard/array.c:1.371 --- php-src/ext/standard/array.c:1.370 Thu Jul 20 22:51:20 2006 +++ php-src/ext/standard/array.c Thu Jul 20 23:21:32 2006 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c,v 1.370 2006/07/20 22:51:20 andrei Exp $ */ +/* $Id: array.c,v 1.371 2006/07/20 23:21:32 andrei Exp $ */ #include "php.h" #include "php_ini.h" @@ -1025,13 +1025,12 @@ static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive TSRMLS_DC) { zval **args[3], /* Arguments to userland function */ - *retval_ptr, /* Return value - unused */ - *key=NULL; /* Entry key */ + *retval_ptr, /* Return value - unused */ + *key=NULL; /* Entry key */ zstr string_key; uint string_key_len; ulong num_key; HashPosition pos; - zend_fcall_info_cache array_walk_fci_cache = empty_fcall_info_cache; /* Set up known arguments */ args[1] = &key; @@ -1039,10 +1038,17 @@ zend_hash_internal_pointer_reset_ex(target_hash, &pos); + BG(array_walk_fci).retval_ptr_ptr = &retval_ptr; + BG(array_walk_fci).param_count = userdata ? 3 : 2; + BG(array_walk_fci).params = args; + BG(array_walk_fci).no_separation = 0; + /* Iterate through hash */ while (!EG(exception) && zend_hash_get_current_data_ex(target_hash, (void **)&args[0], &pos) == SUCCESS) { if (recursive && Z_TYPE_PP(args[0]) == IS_ARRAY) { HashTable *thash; + zend_fcall_info orig_array_walk_fci; + zend_fcall_info_cache orig_array_walk_fci_cache; SEPARATE_ZVAL_TO_MAKE_IS_REF(args[0]); thash = HASH_OF(*(args[0])); @@ -1050,10 +1056,17 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected"); return 0; } + + /* backup the fcall info and cache */ + orig_array_walk_fci = BG(array_walk_fci); + orig_array_walk_fci_cache = BG(array_walk_fci_cache); + php_array_walk(thash, userdata, recursive TSRMLS_CC); - } else { - zend_fcall_info fci; + /* restore the fcall info and cache */ + BG(array_walk_fci) = orig_array_walk_fci; + BG(array_walk_fci_cache) = orig_array_walk_fci_cache; + } else { /* Allocate space for key */ MAKE_STD_ZVAL(key); @@ -1071,29 +1084,14 @@ break; } - fci.size = sizeof(fci); - fci.function_table = EG(function_table); - fci.function_name = *BG(array_walk_func_name); - fci.symbol_table = NULL; - fci.object_pp = NULL; - fci.retval_ptr_ptr = &retval_ptr; - fci.param_count = userdata ? 3 : 2; - fci.params = args; - fci.no_separation = 0; - /* Call the userland function */ - if (zend_call_function(&fci, &array_walk_fci_cache TSRMLS_CC) == SUCCESS) { + if (zend_call_function(&BG(array_walk_fci), &BG(array_walk_fci_cache) TSRMLS_CC) == SUCCESS) { if (retval_ptr) { zval_ptr_dtor(&retval_ptr); } } else { zval func_name; - if (zend_is_callable(*BG(array_walk_func_name), 0, &func_name)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %R()", Z_TYPE(func_name), Z_UNIVAL(func_name)); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %R() - function does not exist", Z_TYPE(func_name), Z_UNIVAL(func_name)); - } if (key) { zval_ptr_dtor(&key); key = NULL; @@ -1113,75 +1111,54 @@ return 0; } -/* {{{ proto bool array_walk(array input, string funcname [, mixed userdata]) +/* {{{ proto bool array_walk(array input, mixed callback [, mixed userdata]) U Apply a user function to every member of an array */ PHP_FUNCTION(array_walk) { - int argc; - zval **array, - **userdata = NULL, - **old_walk_func_name; - HashTable *target_hash; + zval *array, + **userdata = NULL; + zend_fcall_info orig_array_walk_fci; + zend_fcall_info_cache orig_array_walk_fci_cache; - argc = ZEND_NUM_ARGS(); - old_walk_func_name = BG(array_walk_func_name); - if (argc < 2 || argc > 3 || - zend_get_parameters_ex(argc, &array, &BG(array_walk_func_name), &userdata) == FAILURE) { - BG(array_walk_func_name) = old_walk_func_name; - WRONG_PARAM_COUNT; - } - target_hash = HASH_OF(*array); - if (!target_hash) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an array"); - BG(array_walk_func_name) = old_walk_func_name; - RETURN_FALSE; - } - if (Z_TYPE_PP(BG(array_walk_func_name)) != IS_ARRAY && - Z_TYPE_PP(BG(array_walk_func_name)) != IS_STRING && - Z_TYPE_PP(BG(array_walk_func_name)) != IS_UNICODE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong syntax for function name"); - BG(array_walk_func_name) = old_walk_func_name; - RETURN_FALSE; + orig_array_walk_fci = BG(array_walk_fci); + orig_array_walk_fci_cache = BG(array_walk_fci_cache); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_DC, "af|Z", &array, + &BG(array_walk_fci), &BG(array_walk_fci_cache), &userdata) == FAILURE) { + BG(array_walk_fci) = orig_array_walk_fci; + BG(array_walk_fci_cache) = orig_array_walk_fci_cache; + return; } - php_array_walk(target_hash, userdata, 0 TSRMLS_CC); - BG(array_walk_func_name) = old_walk_func_name; + + php_array_walk(HASH_OF(array), userdata, 0 TSRMLS_CC); + BG(array_walk_fci) = orig_array_walk_fci; + BG(array_walk_fci_cache) = orig_array_walk_fci_cache; RETURN_TRUE; } /* }}} */ -/* {{{ proto bool array_walk_recursive(array input, string funcname [, mixed userdata]) +/* {{{ proto bool array_walk_recursive(array input, mixed callback [, mixed userdata]) U Apply a user function recursively to every member of an array */ PHP_FUNCTION(array_walk_recursive) { - int argc; - zval **array, - **userdata = NULL, - **old_walk_func_name; - HashTable *target_hash; + zval *array, + **userdata = NULL; + zend_fcall_info orig_array_walk_fci; + zend_fcall_info_cache orig_array_walk_fci_cache; - argc = ZEND_NUM_ARGS(); - old_walk_func_name = BG(array_walk_func_name); + orig_array_walk_fci = BG(array_walk_fci); + orig_array_walk_fci_cache = BG(array_walk_fci_cache); - if (argc < 2 || argc > 3 || - zend_get_parameters_ex(argc, &array, &BG(array_walk_func_name), &userdata) == FAILURE) { - BG(array_walk_func_name) = old_walk_func_name; - WRONG_PARAM_COUNT; - } - target_hash = HASH_OF(*array); - if (!target_hash) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an array"); - BG(array_walk_func_name) = old_walk_func_name; - RETURN_FALSE; - } - if (Z_TYPE_PP(BG(array_walk_func_name)) != IS_ARRAY && - Z_TYPE_PP(BG(array_walk_func_name)) != IS_STRING && - Z_TYPE_PP(BG(array_walk_func_name)) != IS_UNICODE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong syntax for function name"); - BG(array_walk_func_name) = old_walk_func_name; - RETURN_FALSE; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_DC, "af|Z", &array, + &BG(array_walk_fci), &BG(array_walk_fci_cache), &userdata) == FAILURE) { + BG(array_walk_fci) = orig_array_walk_fci; + BG(array_walk_fci_cache) = orig_array_walk_fci_cache; + return; } - php_array_walk(target_hash, userdata, 1 TSRMLS_CC); - BG(array_walk_func_name) = old_walk_func_name; + + php_array_walk(HASH_OF(array), userdata, 1 TSRMLS_CC); + BG(array_walk_fci) = orig_array_walk_fci; + BG(array_walk_fci_cache) = orig_array_walk_fci_cache; RETURN_TRUE; } /* }}} */ @@ -3332,6 +3309,7 @@ /* }}} */ +/* {{{ php_array_diff */ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_compare_type, int key_compare_type) { zval ***args = NULL; @@ -3634,6 +3612,7 @@ efree(lists); efree(args); } +/* }}} */ /* {{{ proto array array_diff_key(array arr1, array arr2 [, array ...]) U http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.793&r2=1.794&diff_format=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.793 php-src/ext/standard/basic_functions.c:1.794 --- php-src/ext/standard/basic_functions.c:1.793 Wed Jul 19 12:25:02 2006 +++ php-src/ext/standard/basic_functions.c Thu Jul 20 23:21:32 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.793 2006/07/19 12:25:02 mike Exp $ */ +/* $Id: basic_functions.c,v 1.794 2006/07/20 23:21:32 andrei Exp $ */ #include "php.h" #include "php_streams.h" @@ -3863,8 +3863,6 @@ BG(left) = -1; BG(user_tick_functions) = NULL; BG(user_filter_map) = NULL; - BG(user_compare_fci) = empty_fcall_info; - BG(user_compare_fci_cache) = empty_fcall_info_cache; zend_hash_init(&BG(sm_protected_env_vars), 5, NULL, NULL, 1); BG(sm_allowed_env_vars) = NULL; @@ -4083,7 +4081,10 @@ BG(strtok_zval) = NULL; BG(locale_string) = NULL; BG(user_compare_func_name) = NULL; - BG(array_walk_func_name) = NULL; + BG(array_walk_fci) = empty_fcall_info; + BG(array_walk_fci_cache) = empty_fcall_info_cache; + BG(user_compare_fci) = empty_fcall_info; + BG(user_compare_fci_cache) = empty_fcall_info_cache; BG(page_uid) = -1; BG(page_gid) = -1; BG(page_inode) = -1; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.h?r1=1.148&r2=1.149&diff_format=u Index: php-src/ext/standard/basic_functions.h diff -u php-src/ext/standard/basic_functions.h:1.148 php-src/ext/standard/basic_functions.h:1.149 --- php-src/ext/standard/basic_functions.h:1.148 Wed Jul 19 12:25:02 2006 +++ php-src/ext/standard/basic_functions.h Thu Jul 20 23:21:32 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.h,v 1.148 2006/07/19 12:25:02 mike Exp $ */ +/* $Id: basic_functions.h,v 1.149 2006/07/20 23:21:32 andrei Exp $ */ #ifndef BASIC_FUNCTIONS_H #define BASIC_FUNCTIONS_H @@ -164,7 +164,8 @@ char strtok_table[256]; ulong strtok_len; char str_ebuf[40]; - zval **array_walk_func_name; + zend_fcall_info array_walk_fci; + zend_fcall_info_cache array_walk_fci_cache; zval **user_compare_func_name; zend_fcall_info user_compare_fci; zend_fcall_info_cache user_compare_fci_cache;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php