diff options
| author | Matt Wilmas <mattwil@php.net> | 2008-05-30 10:55:44 +0000 |
|---|---|---|
| committer | Matt Wilmas <mattwil@php.net> | 2008-05-30 10:55:44 +0000 |
| commit | b3abcd8a34678e8f49ca8e1a278f076f25923400 (patch) | |
| tree | 2049c83ac13037c444bce475a71a2b845326e09e /ext | |
| parent | 76a95184ef52d1d147a6b75ef2bb96e496db25bb (diff) | |
| download | php-git-b3abcd8a34678e8f49ca8e1a278f076f25923400.tar.gz | |
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)
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/standard/array.c | 48 |
1 files changed, 16 insertions, 32 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index 089e10b417..fcf9919562 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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; |
