1b5975d6bSopenharmony_ciFrom aee84cb45caf42e336dee5183d561b89eb44f8f3 Mon Sep 17 00:00:00 2001 2b5975d6bSopenharmony_ciFrom: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net> 3b5975d6bSopenharmony_ciDate: Tue, 6 Sep 2022 18:56:39 +0200 4b5975d6bSopenharmony_ciSubject: [PATCH] gregex: Avoid re-allocating if we have no size change 5b5975d6bSopenharmony_ci 6b5975d6bSopenharmony_ciThis is handled by the syscall underneath, but we can just avoid a call 7b5975d6bSopenharmony_cicheaply. 8b5975d6bSopenharmony_ci--- 9b5975d6bSopenharmony_ci glib/gregex.c | 13 ++++++++++--- 10b5975d6bSopenharmony_ci 1 file changed, 10 insertions(+), 3 deletions(-) 11b5975d6bSopenharmony_ci 12b5975d6bSopenharmony_cidiff --git a/glib/gregex.c b/glib/gregex.c 13b5975d6bSopenharmony_ciindex 84c4245753..cf86f0fe0d 100644 14b5975d6bSopenharmony_ci--- a/glib/gregex.c 15b5975d6bSopenharmony_ci+++ b/glib/gregex.c 16b5975d6bSopenharmony_ci@@ -832,6 +832,7 @@ recalc_match_offsets (GMatchInfo *match_info, 17b5975d6bSopenharmony_ci GError **error) 18b5975d6bSopenharmony_ci { 19b5975d6bSopenharmony_ci PCRE2_SIZE *ovector; 20b5975d6bSopenharmony_ci+ uint32_t pre_n_offset; 21b5975d6bSopenharmony_ci uint32_t i; 22b5975d6bSopenharmony_ci 23b5975d6bSopenharmony_ci if (pcre2_get_ovector_count (match_info->match_data) > G_MAXUINT32 / 2) 24b5975d6bSopenharmony_ci@@ -842,11 +843,17 @@ recalc_match_offsets (GMatchInfo *match_info, 25b5975d6bSopenharmony_ci return FALSE; 26b5975d6bSopenharmony_ci } 27b5975d6bSopenharmony_ci 28b5975d6bSopenharmony_ci+ pre_n_offset = match_info->n_offsets; 29b5975d6bSopenharmony_ci match_info->n_offsets = pcre2_get_ovector_count (match_info->match_data) * 2; 30b5975d6bSopenharmony_ci ovector = pcre2_get_ovector_pointer (match_info->match_data); 31b5975d6bSopenharmony_ci- match_info->offsets = g_realloc_n (match_info->offsets, 32b5975d6bSopenharmony_ci- match_info->n_offsets, 33b5975d6bSopenharmony_ci- sizeof (gint)); 34b5975d6bSopenharmony_ci+ 35b5975d6bSopenharmony_ci+ if (match_info->n_offsets != pre_n_offset) 36b5975d6bSopenharmony_ci+ { 37b5975d6bSopenharmony_ci+ match_info->offsets = g_realloc_n (match_info->offsets, 38b5975d6bSopenharmony_ci+ match_info->n_offsets, 39b5975d6bSopenharmony_ci+ sizeof (gint)); 40b5975d6bSopenharmony_ci+ } 41b5975d6bSopenharmony_ci+ 42b5975d6bSopenharmony_ci for (i = 0; i < match_info->n_offsets; i++) 43b5975d6bSopenharmony_ci { 44b5975d6bSopenharmony_ci match_info->offsets[i] = (int) ovector[i]; 45b5975d6bSopenharmony_ci-- 46b5975d6bSopenharmony_ciGitLab 47b5975d6bSopenharmony_ci 48