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