mattwil         Fri May 30 10:55:15 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src/ext/standard       array.c 
  Log:
  MFH: Only check args once in php_array_diff_key/intersect_key, not on each 
iteration. This also makes sure ALL args are checked (pre-5.2.5 behavior)
  - Also, use new hash_quick_del function where possible
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.308.2.21.2.37.2.31&r2=1.308.2.21.2.37.2.32&diff_format=u
Index: php-src/ext/standard/array.c
diff -u php-src/ext/standard/array.c:1.308.2.21.2.37.2.31 
php-src/ext/standard/array.c:1.308.2.21.2.37.2.32
--- php-src/ext/standard/array.c:1.308.2.21.2.37.2.31   Tue May 27 10:29:33 2008
+++ php-src/ext/standard/array.c        Fri May 30 10:55:14 2008
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: array.c,v 1.308.2.21.2.37.2.31 2008/05/27 10:29:33 mattwil Exp $ */
+/* $Id: array.c,v 1.308.2.21.2.37.2.32 2008/05/30 10:55:14 mattwil Exp $ */
 
 #include "php.h"
 #include "php_ini.h"
@@ -2754,7 +2754,7 @@
                                if (Z_ARRVAL_P(return_value) == 
&EG(symbol_table)) {
                                        zend_delete_global_variable(p->arKey, 
p->nKeyLength - 1 TSRMLS_CC);
                                } else {
-                                       zend_hash_del(Z_ARRVAL_P(return_value), 
p->arKey, p->nKeyLength);
+                                       
zend_hash_quick_del(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength, p->h);
                                }
                        }
                }
@@ -2851,10 +2851,12 @@
                }
        }
 
-       if (Z_TYPE_PP(args[0]) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #1 is not 
an array");
-               RETVAL_NULL();
-               goto out;
+       for (i = 0; i < argc; i++) {
+               if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument 
#%d is not an array", i + 1);
+                       RETVAL_NULL();
+                       goto out;
+               }
        }
 
        array_init(return_value);
@@ -2863,12 +2865,7 @@
                if (p->nKeyLength == 0) {
                        ok = 1;
                        for (i = 1; i < argc; i++) {
-                               if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
-                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Argument #%d is not an array", i + 1);
-                                       zval_dtor(return_value);
-                                       RETVAL_NULL();
-                                       goto out;
-                               } else if 
(zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == FAILURE ||
+                               if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), 
p->h, (void**)&data) == FAILURE ||
                                        (intersect_data_compare_func &&
                                        
intersect_data_compare_func((zval**)p->pData, data TSRMLS_CC) != 0)
                                ) {
@@ -2883,12 +2880,7 @@
                } else {
                        ok = 1;
                        for (i = 1; i < argc; i++) {
-                               if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
-                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Argument #%d is not an array", i + 1);
-                                       zval_dtor(return_value);
-                                       RETVAL_NULL();
-                                       goto out;
-                               } else if 
(zend_hash_quick_find(Z_ARRVAL_PP(args[i]), p->arKey, p->nKeyLength, p->h, 
(void**)&data) == FAILURE ||
+                               if (zend_hash_quick_find(Z_ARRVAL_PP(args[i]), 
p->arKey, p->nKeyLength, p->h, (void**)&data) == FAILURE ||
                                        (intersect_data_compare_func &&
                                        
intersect_data_compare_func((zval**)p->pData, data TSRMLS_CC) != 0)
                                ) {
@@ -3118,7 +3110,7 @@
                                        if (p->nKeyLength == 0) {
                                                
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
                                        } else {
-                                               
zend_hash_del(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength);
+                                               
zend_hash_quick_del(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength, p->h);
                                        }
                                }
                        }
@@ -3134,7 +3126,7 @@
                                if (p->nKeyLength == 0) {
                                        
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
                                } else {
-                                       zend_hash_del(Z_ARRVAL_P(return_value), 
p->arKey, p->nKeyLength);
+                                       
zend_hash_quick_del(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength, p->h);
                                }
                                if (!*++ptrs[0]) {
                                        goto out;
@@ -3277,10 +3269,12 @@
                }
        }
 
-       if (Z_TYPE_PP(args[0]) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #1 is not 
an array");
-               RETVAL_NULL();
-               goto out;
+       for (i = 0; i < argc; i++) {
+               if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument 
#%d is not an array", i + 1);
+                       RETVAL_NULL();
+                       goto out;
+               }
        }
 
        array_init(return_value);
@@ -3289,12 +3283,7 @@
                if (p->nKeyLength == 0) {
                        ok = 1;
                        for (i = 1; i < argc; i++) {
-                               if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
-                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Argument #%d is not an array", i + 1);
-                                       zval_dtor(return_value);
-                                       RETVAL_NULL();
-                                       goto out;
-                               } else if 
(zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == SUCCESS &&
+                               if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), 
p->h, (void**)&data) == SUCCESS &&
                                        (!diff_data_compare_func ||
                                        
diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0)
                                ) {
@@ -3309,12 +3298,7 @@
                } else {
                        ok = 1;
                        for (i = 1; i < argc; i++) {
-                               if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
-                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Argument #%d is not an array", i + 1);
-                                       zval_dtor(return_value);
-                                       RETVAL_NULL();
-                                       goto out;
-                               } else if 
(zend_hash_quick_find(Z_ARRVAL_PP(args[i]), p->arKey, p->nKeyLength, p->h, 
(void**)&data) == SUCCESS &&
+                               if (zend_hash_quick_find(Z_ARRVAL_PP(args[i]), 
p->arKey, p->nKeyLength, p->h, (void**)&data) == SUCCESS &&
                                        (!diff_data_compare_func ||
                                        
diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0)
                                ) {
@@ -3556,7 +3540,7 @@
                                if (p->nKeyLength == 0) {
                                        
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
                                } else {
-                                       zend_hash_del(Z_ARRVAL_P(return_value), 
p->arKey, p->nKeyLength);
+                                       
zend_hash_quick_del(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength, p->h);
                                }
                                if (!*++ptrs[0]) {
                                        goto out;



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to