From 75e3f3e0cad717cae199edc977fbdbb08ff4f4ef Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Tue, 5 Mar 2024 20:51:12 +0100 Subject: [PATCH] Optimize strpbrk (#13558) --- ext/standard/string.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 4b34ef40090..058eeb37733 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -6144,7 +6144,6 @@ PHP_FUNCTION(str_split) PHP_FUNCTION(strpbrk) { zend_string *haystack, *char_list; - const char *haystack_ptr, *cl_ptr; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -6156,12 +6155,14 @@ PHP_FUNCTION(strpbrk) RETURN_THROWS(); } - for (haystack_ptr = ZSTR_VAL(haystack); haystack_ptr < (ZSTR_VAL(haystack) + ZSTR_LEN(haystack)); ++haystack_ptr) { - for (cl_ptr = ZSTR_VAL(char_list); cl_ptr < (ZSTR_VAL(char_list) + ZSTR_LEN(char_list)); ++cl_ptr) { - if (*cl_ptr == *haystack_ptr) { - RETURN_STRINGL(haystack_ptr, (ZSTR_VAL(haystack) + ZSTR_LEN(haystack) - haystack_ptr)); - } - } + size_t shift = php_strcspn( + ZSTR_VAL(haystack), + ZSTR_VAL(char_list), + ZSTR_VAL(haystack) + ZSTR_LEN(haystack), + ZSTR_VAL(char_list) + ZSTR_LEN(char_list) + ); + if (shift < ZSTR_LEN(haystack)) { + RETURN_STRINGL(ZSTR_VAL(haystack) + shift, ZSTR_LEN(haystack) - shift); } RETURN_FALSE;