Mercurial > hg > xemacs-beta
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