]> granicus.if.org Git - vim/commitdiff
patch 8.0.1541: synpat_T is taking too much memory v8.0.1541
authorBram Moolenaar <Bram@vim.org>
Sat, 24 Feb 2018 20:36:34 +0000 (21:36 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 24 Feb 2018 20:36:34 +0000 (21:36 +0100)
Problem:    synpat_T is taking too much memory.
Solution:   Reorder members to reduce padding. (Dominique Pelle, closes #2671)

src/syntax.c
src/version.c

index 79b2796d2b0d248c7ecb5dc2e8605cf3e557b1cf..89941b62596b98e28e8adbf5f39e953540d17f12 100644 (file)
@@ -145,30 +145,32 @@ static char *(spo_name_tab[SPO_COUNT]) =
  *
  * A character offset can be given for the matched text (_m_start and _m_end)
  * and for the actually highlighted text (_h_start and _h_end).
+ *
+ * Note that ordering of members is optimized to reduce padding.
  */
 typedef struct syn_pattern
 {
     char        sp_type;               /* see SPTYPE_ defines below */
     char        sp_syncing;            /* this item used for syncing */
+    short       sp_syn_match_id;       /* highlight group ID of pattern */
+    short       sp_off_flags;          /* see below */
+    int                 sp_offsets[SPO_COUNT]; /* offsets */
     int                 sp_flags;              /* see HL_ defines below */
 #ifdef FEAT_CONCEAL
     int                 sp_cchar;              /* conceal substitute character */
 #endif
+    int                 sp_ic;                 /* ignore-case flag for sp_prog */
+    int                 sp_sync_idx;           /* sync item index (syncing only) */
+    int                 sp_line_id;            /* ID of last line where tried */
+    int                 sp_startcol;           /* next match in sp_line_id line */
+    short      *sp_cont_list;          /* cont. group IDs, if non-zero */
+    short      *sp_next_list;          /* next group IDs, if non-zero */
     struct sp_syn sp_syn;              /* struct passed to in_id_list() */
-    short       sp_syn_match_id;       /* highlight group ID of pattern */
     char_u     *sp_pattern;            /* regexp to match, pattern */
     regprog_T  *sp_prog;               /* regexp to match, program */
 #ifdef FEAT_PROFILE
     syn_time_T  sp_time;
 #endif
-    int                 sp_ic;                 /* ignore-case flag for sp_prog */
-    short       sp_off_flags;          /* see below */
-    int                 sp_offsets[SPO_COUNT]; /* offsets */
-    short      *sp_cont_list;          /* cont. group IDs, if non-zero */
-    short      *sp_next_list;          /* next group IDs, if non-zero */
-    int                 sp_sync_idx;           /* sync item index (syncing only) */
-    int                 sp_line_id;            /* ID of last line where tried */
-    int                 sp_startcol;           /* next match in sp_line_id line */
 } synpat_T;
 
 /* The sp_off_flags are computed like this:
index 48c21fc448adc2b4af78a0a540b305659fe16f4e..12ad747a752b5f1cce770737c2ac72aff1a85619 100644 (file)
@@ -778,6 +778,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1541,
 /**/
     1540,
 /**/