XEmacs 21.2.20 "Yoko".
[chise/xemacs-chise.git.1] / src / dynarr.c
index 4167b5b..02f4343 100644 (file)
@@ -111,6 +111,19 @@ Use the following global variable:
 
 int Dynarr_min_size = 1;
 
+static void
+Dynarr_realloc (Dynarr *dy, int new_size)
+{
+  if (DUMPEDP (dy->base))
+    {
+      void *new_base = malloc (new_size);
+      memcpy (new_base, dy->base, dy->max > new_size ? new_size : dy->max);
+      dy->base = new_base;
+    }
+  else
+    dy->base = xrealloc (dy->base, new_size);
+}
+
 void *
 Dynarr_newf (int elsize)
 {
@@ -138,7 +151,7 @@ Dynarr_resize (void *d, int size)
   /* Don't do anything if the array is already big enough. */
   if (newsize > dy->max)
     {
-      dy->base = xrealloc (dy->base, newsize*dy->elsize);
+      Dynarr_realloc (dy, newsize*dy->elsize);
       dy->max = newsize;
     }
 }
@@ -186,9 +199,10 @@ Dynarr_free (void *d)
 {
   Dynarr *dy = (Dynarr *) d;
 
-  if (dy->base)
+  if (dy->base && !DUMPEDP (dy->base))
     xfree (dy->base);
-  xfree (dy);
+  if(!DUMPEDP (dy))
+    xfree (dy);
 }
 
 #ifdef MEMORY_USAGE_STATS