]> granicus.if.org Git - php/commitdiff
MFH: Only check args once in php_array_diff_key/intersect_key, not on each iteration...
authorMatt Wilmas <mattwil@php.net>
Fri, 30 May 2008 10:55:44 +0000 (10:55 +0000)
committerMatt Wilmas <mattwil@php.net>
Fri, 30 May 2008 10:55:44 +0000 (10:55 +0000)
ext/standard/array.c

index 089e10b417fefa03e8be52003c720d29e967cd30..fcf9919562ed36850d462856d0493a7d77855dc2 100644 (file)
@@ -2992,10 +2992,12 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
                intersect_data_compare_func = zval_compare;
        }
 
-       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);
@@ -3004,12 +3006,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
                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)) {
                                        ok = 0;
@@ -3023,12 +3020,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
                } 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)) {
                                        ok = 0;
@@ -3470,10 +3462,12 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
                diff_data_compare_func = zval_compare;
        }
 
-       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);
@@ -3482,12 +3476,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
                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)) {
                                        ok = 0;
@@ -3501,12 +3490,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
                } 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)) {
                                        ok = 0;