diff src/dynarr.c @ 5118:e0db3c197671 ben-lisp-object

merge up to latest default branch, doesn't compile yet
author Ben Wing <ben@xemacs.org>
date Sat, 26 Dec 2009 21:18:49 -0600
parents 229bd619740a
children d1247f3cc363
line wrap: on
line diff
--- a/src/dynarr.c	Sat Dec 26 00:20:27 2009 -0600
+++ b/src/dynarr.c	Sat Dec 26 21:18:49 2009 -0600
@@ -129,20 +129,21 @@
 static int Dynarr_min_size = 8;
 
 static void
-Dynarr_realloc (Dynarr *dy, Bytecount new_size)
+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 ? dy->max : new_size);
+      void *new_base = malloc (new_size * dy->elsize);
+      memcpy (new_base, dy->base, 
+	      (dy->max < new_size ? dy->max : new_size) * dy->elsize);
       dy->base = new_base;
     }
   else
-    dy->base = xrealloc (dy->base, new_size);
+    dy->base = xrealloc (dy->base, new_size * dy->elsize);
 }
 
 void *
-Dynarr_newf (int elsize)
+Dynarr_newf (Bytecount elsize)
 {
   Dynarr *d = xnew_and_zero (Dynarr);
   d->elsize = elsize;
@@ -150,6 +151,35 @@
   return d;
 }
 
+#ifdef NEW_GC
+DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT ("dynarr", dynarr,
+				      0, 0,
+				      Dynarr);
+
+static void
+Dynarr_lisp_realloc (Dynarr *dy, Elemcount new_size)
+{
+  void *new_base =
+    XPNTR (alloc_sized_lrecord_array (dy->elsize, new_size, dy->lisp_imp));
+  if (dy->base)
+    memcpy (new_base, dy->base, 
+	    (dy->max < new_size ? dy->max : new_size) * dy->elsize);
+  dy->base = new_base;
+}
+
+void *
+Dynarr_lisp_newf (Bytecount elsize, 
+		  const struct lrecord_implementation *dynarr_imp, 
+		  const struct lrecord_implementation *imp)
+{
+  Dynarr *d = (Dynarr *) XPNTR (ALLOC_LISP_OBJECT (dynarr));
+  d->elsize = elsize;
+  d->lisp_imp = imp;
+
+  return d;
+}
+#endif /* not NEW_GC */
+
 void
 Dynarr_resize (void *d, Elemcount size)
 {
@@ -168,7 +198,14 @@
   /* Don't do anything if the array is already big enough. */
   if (newsize > dy->max)
     {
-      Dynarr_realloc (dy, newsize*dy->elsize);
+#ifdef NEW_GC
+      if (dy->lisp_imp)
+	Dynarr_lisp_realloc (dy, newsize);
+      else
+	Dynarr_realloc (dy, newsize);
+#else /* not NEW_GC */
+      Dynarr_realloc (dy, newsize);
+#endif /* not NEW_GC */
       dy->max = newsize;
     }
 }
@@ -222,10 +259,23 @@
 {
   Dynarr *dy = (Dynarr *) d;
 
+#ifdef NEW_GC
+  if (dy->base && !DUMPEDP (dy->base))
+    {
+      if (!dy->lisp_imp)
+	xfree (dy->base, void *);
+    }
+  if(!DUMPEDP (dy))
+    {
+      if (!dy->lisp_imp)
+	xfree (dy, Dynarr *);
+    }
+#else /* not NEW_GC */
   if (dy->base && !DUMPEDP (dy->base))
     xfree (dy->base, void *);
   if(!DUMPEDP (dy))
     xfree (dy, Dynarr *);
+#endif /* not NEW_GC */
 }
 
 #ifdef MEMORY_USAGE_STATS