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

Reply via email to