mirror of
https://github.com/php/php-src.git
synced 2024-09-27 12:57:26 +00:00
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
This commit is contained in:
parent
3dd931c869
commit
3a9eea4a8d
@ -2978,7 +2978,7 @@ PHP_FUNCTION(array_unique)
|
||||
if (Z_ARRVAL_P(return_value) == &EG(symbol_table)) {
|
||||
zend_u_delete_global_variable(p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength - 1 TSRMLS_CC);
|
||||
} else {
|
||||
zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength);
|
||||
zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3075,10 +3075,12 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
@ -3087,12 +3089,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)
|
||||
) {
|
||||
@ -3107,12 +3104,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_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == FAILURE ||
|
||||
if (zend_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == FAILURE ||
|
||||
(intersect_data_compare_func &&
|
||||
intersect_data_compare_func((zval**)p->pData, data TSRMLS_CC) != 0)
|
||||
) {
|
||||
@ -3342,7 +3334,7 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int
|
||||
if (p->nKeyLength == 0) {
|
||||
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
|
||||
} else {
|
||||
zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength);
|
||||
zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3358,7 +3350,7 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int
|
||||
if (p->nKeyLength == 0) {
|
||||
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
|
||||
} else {
|
||||
zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength);
|
||||
zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h);
|
||||
}
|
||||
if (!*++ptrs[0]) {
|
||||
goto out;
|
||||
@ -3501,10 +3493,12 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
@ -3513,12 +3507,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)
|
||||
) {
|
||||
@ -3533,12 +3522,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_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == SUCCESS &&
|
||||
if (zend_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == SUCCESS &&
|
||||
(!diff_data_compare_func ||
|
||||
diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0)
|
||||
) {
|
||||
@ -3780,7 +3764,7 @@ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_
|
||||
if (p->nKeyLength == 0) {
|
||||
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
|
||||
} else {
|
||||
zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength);
|
||||
zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h);
|
||||
}
|
||||
if (!*++ptrs[0]) {
|
||||
goto out;
|
||||
|
Loading…
Reference in New Issue
Block a user