Commit 900797e54fb for php.net
commit 900797e54fb8d21a761205e5788b9275dc1c7c0e
Author: Weilin Du <108666168+LamentXU123@users.noreply.github.com>
Date: Sun May 24 19:00:02 2026 +0800
ext/intl: various optimization (#22069)
- use array_init_size for known-size arrays
- reuse known string lengths
diff --git a/ext/intl/calendar/calendar_methods.cpp b/ext/intl/calendar/calendar_methods.cpp
index 03a9e6497d8..fe4749d6d62 100644
--- a/ext/intl/calendar/calendar_methods.cpp
+++ b/ext/intl/calendar/calendar_methods.cpp
@@ -203,7 +203,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_available_locales)
int32_t count;
const Locale *availLocales = Calendar::getAvailableLocales(count);
- array_init(return_value);
+ array_init_size(return_value, count);
for (int i = 0; i < count; i++) {
Locale locale = availLocales[i];
add_next_index_string(return_value, locale.getName());
diff --git a/ext/intl/dateformat/dateformat_parse.cpp b/ext/intl/dateformat/dateformat_parse.cpp
index 667bbf98ac6..13cf56ad7d8 100644
--- a/ext/intl/dateformat/dateformat_parse.cpp
+++ b/ext/intl/dateformat/dateformat_parse.cpp
@@ -108,7 +108,7 @@ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* tex
INTL_METHOD_CHECK_STATUS( dfo, "Date parsing failed" );
- array_init( return_value );
+ array_init_size( return_value, 9 );
/* Add entries from various fields of the obtained parsed_calendar */
add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_SECOND, CALENDAR_SEC);
add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_MINUTE, CALENDAR_MIN);
diff --git a/ext/intl/locale/locale_methods.cpp b/ext/intl/locale/locale_methods.cpp
index e325e14e0d4..1ee32a2f094 100644
--- a/ext/intl/locale/locale_methods.cpp
+++ b/ext/intl/locale/locale_methods.cpp
@@ -457,7 +457,7 @@ static zend_string* get_icu_value_internal( const char* loc_name , const char* t
efree( mod_loc_name);
}
- tag_value->len = strlen(tag_value->val);
+ tag_value->len = buflen;
return tag_value;
}
/* }}} */
@@ -736,7 +736,7 @@ U_CFUNC PHP_FUNCTION( locale_get_keywords )
Z_PARAM_PATH(loc_name, loc_name_len)
ZEND_PARSE_PARAMETERS_END();
- INTL_CHECK_LOCALE_LEN(strlen(loc_name));
+ INTL_CHECK_LOCALE_LEN(loc_name_len);
if(loc_name_len == 0) {
loc_name = (char *)intl_locale_get_default();
@@ -1127,7 +1127,7 @@ U_CFUNC PHP_FUNCTION(locale_parse)
Z_PARAM_PATH(loc_name, loc_name_len)
ZEND_PARSE_PARAMETERS_END();
- INTL_CHECK_LOCALE_LEN(strlen(loc_name));
+ INTL_CHECK_LOCALE_LEN(loc_name_len);
if(loc_name_len == 0) {
loc_name = (char *)intl_locale_get_default();
@@ -1318,7 +1318,7 @@ U_CFUNC PHP_FUNCTION(locale_filter_matches)
if( token && (token==cur_lang_tag) ){
/* check if the char. after match is SEPARATOR */
- chrcheck = token + (strlen(cur_loc_range));
+ chrcheck = token + can_loc_range->len;
if( isIDSeparator(*chrcheck) || isKeywordSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
efree( cur_lang_tag );
efree( cur_loc_range );
@@ -1350,14 +1350,14 @@ U_CFUNC PHP_FUNCTION(locale_filter_matches)
} /* end of if isCanonical */
else{
/* Convert to lower case for case-insensitive comparison */
- cur_lang_tag = reinterpret_cast<char *>(ecalloc( 1, strlen(lang_tag ) + 1));
+ cur_lang_tag = reinterpret_cast<char *>(ecalloc(1, lang_tag_len + 1));
result = strToMatch( lang_tag , cur_lang_tag);
if( result == 0) {
efree( cur_lang_tag );
RETURN_FALSE;
}
- cur_loc_range = reinterpret_cast<char *>(ecalloc( 1, strlen(loc_range ) + 1));
+ cur_loc_range = reinterpret_cast<char *>(ecalloc(1, loc_range_len + 1));
result = strToMatch( loc_range , cur_loc_range );
if( result == 0) {
efree( cur_lang_tag );
@@ -1370,7 +1370,7 @@ U_CFUNC PHP_FUNCTION(locale_filter_matches)
if( token && (token==cur_lang_tag) ){
/* check if the char. after match is SEPARATOR */
- chrcheck = token + (strlen(cur_loc_range));
+ chrcheck = token + loc_range_len;
if( isIDSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
efree( cur_lang_tag );
efree( cur_loc_range );