Use gdb::def_vector in find_source_lines
authorTom Tromey <tom@tromey.com>
Tue, 6 Feb 2018 19:51:42 +0000 (12:51 -0700)
committerTom Tromey <tom@tromey.com>
Thu, 8 Feb 2018 18:46:57 +0000 (11:46 -0700)
This replaces an explicit malloc and a cleanup with a gdb::def_vector.

2018-02-08  Tom Tromey  <tom@tromey.com>

* source.c (find_source_lines): Use gdb::def_vector.

gdb/ChangeLog
gdb/source.c

index ec219be2ae949cf223c48cd9ace8216ce2ece9d7..1e16a1c8c7af791a96acf4663b2933ab1a347876 100644 (file)
@@ -1,3 +1,7 @@
+2018-02-08  Tom Tromey  <tom@tromey.com>
+
+       * source.c (find_source_lines): Use gdb::def_vector.
+
 2018-02-08  Tom Tromey  <tom@tromey.com>
 
        * macrocmd.c (struct temporary_macro_definition): New.
index 1f136f4cfb29e7a0d84cbbcc70ffb1dc41f6f0b2..9eec58febdd4a06fe1800499fd67ffab47a60d2f 100644 (file)
@@ -1186,7 +1186,7 @@ void
 find_source_lines (struct symtab *s, int desc)
 {
   struct stat st;
-  char *data, *p, *end;
+  char *p, *end;
   int nlines = 0;
   int lines_allocated = 1000;
   int *line_charpos;
@@ -1207,23 +1207,20 @@ find_source_lines (struct symtab *s, int desc)
     warning (_("Source file is more recent than executable."));
 
   {
-    struct cleanup *old_cleanups;
-
     /* st_size might be a large type, but we only support source files whose 
        size fits in an int.  */
     size = (int) st.st_size;
 
-    /* Use malloc, not alloca, because this may be pretty large, and we may
-       run into various kinds of limits on stack size.  */
-    data = (char *) xmalloc (size);
-    old_cleanups = make_cleanup (xfree, data);
+    /* Use the heap, not the stack, because this may be pretty large,
+       and we may run into various kinds of limits on stack size.  */
+    gdb::def_vector<char> data (size);
 
     /* Reassign `size' to result of read for systems where \r\n -> \n.  */
-    size = myread (desc, data, size);
+    size = myread (desc, data.data (), size);
     if (size < 0)
       perror_with_name (symtab_to_filename_for_display (s));
-    end = data + size;
-    p = data;
+    end = &data[size];
+    p = &data[0];
     line_charpos[0] = 0;
     nlines = 1;
     while (p != end)
@@ -1239,10 +1236,9 @@ find_source_lines (struct symtab *s, int desc)
                  (int *) xrealloc ((char *) line_charpos,
                                    sizeof (int) * lines_allocated);
              }
-           line_charpos[nlines++] = p - data;
+           line_charpos[nlines++] = p - data.data ();
          }
       }
-    do_cleanups (old_cleanups);
   }
 
   s->nlines = nlines;