diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-12-27 11:11:40 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-12-27 11:11:40 +0300 |
commit | 107ae86ca6baf2b79d8ddb32b54676a28269ba1f (patch) | |
tree | 9b5e75a7405c70801665789d7344559501696bc1 /ext/standard/array.c | |
parent | 37466b03686d234f38fc0ec4e0742cbf8dfb5e27 (diff) | |
download | php-git-107ae86ca6baf2b79d8ddb32b54676a28269ba1f.tar.gz |
Introduce specialized functions to compare with integer and string, to eliminate repeatable checks on each loop iteration in in_array() function.
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r-- | ext/standard/array.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index 410ff21b9a..2ae3119549 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1273,20 +1273,53 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) } } ZEND_HASH_FOREACH_END(); } else { - ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) { - if (fast_equal_check_function(value, entry)) { - if (behavior == 0) { - RETURN_TRUE; - } else { - if (str_idx) { - RETVAL_STR(zend_string_copy(str_idx)); + ZVAL_DEREF(value); + if (Z_TYPE_P(value) == IS_LONG) { + ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) { + if (fast_equal_check_long(value, entry)) { + if (behavior == 0) { + RETURN_TRUE; } else { - RETVAL_LONG(num_idx); + if (str_idx) { + RETVAL_STR(zend_string_copy(str_idx)); + } else { + RETVAL_LONG(num_idx); + } + return; } - return; } - } - } ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FOREACH_END(); + } else if (Z_TYPE_P(value) == IS_STRING) { + ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) { + if (fast_equal_check_string(value, entry)) { + if (behavior == 0) { + RETURN_TRUE; + } else { + if (str_idx) { + RETVAL_STR(zend_string_copy(str_idx)); + } else { + RETVAL_LONG(num_idx); + } + return; + } + } + } ZEND_HASH_FOREACH_END(); + } else { + ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) { + if (fast_equal_check_function(value, entry)) { + if (behavior == 0) { + RETURN_TRUE; + } else { + if (str_idx) { + RETVAL_STR(zend_string_copy(str_idx)); + } else { + RETVAL_LONG(num_idx); + } + return; + } + } + } ZEND_HASH_FOREACH_END(); + } } RETURN_FALSE; |