[glib/wip/3v1n0/regex-pcre2-flags-fixes: 9/11] gregex: Avoid re-allocating if we have no size change




commit 6bb350f25cd037f3b2baab3bb05e3035a1ff5892
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Tue Sep 6 18:56:39 2022 +0200

    gregex: Avoid re-allocating if we have no size change
    
    This is handled by the syscall underneath, but we can just avoid a call
    cheaply.

 glib/gregex.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)
---
diff --git a/glib/gregex.c b/glib/gregex.c
index 3afb9b385f..ba09904185 100644
--- a/glib/gregex.c
+++ b/glib/gregex.c
@@ -857,6 +857,7 @@ recalc_match_offsets (GMatchInfo *match_info,
                       GError     **error)
 {
   PCRE2_SIZE *ovector;
+  uint32_t pre_n_offset;
   uint32_t i;
 
   if (pcre2_get_ovector_count (match_info->match_data) > G_MAXUINT32 / 2)
@@ -867,11 +868,17 @@ recalc_match_offsets (GMatchInfo *match_info,
       return FALSE;
     }
 
+  pre_n_offset = match_info->n_offsets;
   match_info->n_offsets = pcre2_get_ovector_count (match_info->match_data) * 2;
   ovector = pcre2_get_ovector_pointer (match_info->match_data);
-  match_info->offsets = g_realloc_n (match_info->offsets,
-                                     match_info->n_offsets,
-                                     sizeof (gint));
+
+  if (match_info->n_offsets != pre_n_offset)
+    {
+      match_info->offsets = g_realloc_n (match_info->offsets,
+                                         match_info->n_offsets,
+                                         sizeof (gint));
+    }
+
   for (i = 0; i < match_info->n_offsets; i++)
     {
       match_info->offsets[i] = (int) ovector[i];


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]