summary refs log tree commit diff
path: root/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'util.c')
-rw-r--r--util.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/util.c b/util.c
index 380f139..9b73771 100644
--- a/util.c
+++ b/util.c
@@ -6,7 +6,7 @@ typedef struct Vec Vec;
 
 struct Vec {
 	ulong mag;
-	void *(*alloc)();
+	Pool pool;
 	size_t esz;
 	ulong cap;
 	union {
@@ -119,18 +119,20 @@ icpy(Ins *d, Ins *s, ulong n)
 }
 
 void *
-vnew(ulong len, size_t esz, void *alloc(size_t))
+vnew(ulong len, size_t esz, Pool pool)
 {
+	void *(*f)(size_t);
 	ulong cap;
 	Vec *v;
 
 	for (cap=VMin; cap<len; cap*=2)
 		;
-	v = alloc(cap * esz + sizeof(Vec));
+	f = pool == Pheap ? emalloc : alloc;
+	v = f(cap * esz + sizeof(Vec));
 	v->mag = VMag;
 	v->cap = cap;
 	v->esz = esz;
-	v->alloc = alloc;
+	v->pool = pool;
 	return v + 1;
 }
 
@@ -141,7 +143,7 @@ vfree(void *p)
 
 	v = (Vec *)p - 1;
 	assert(v->mag == VMag);
-	if (v->alloc == emalloc) {
+	if (v->pool == Pheap) {
 		v->mag = 0;
 		free(v);
 	}
@@ -157,7 +159,7 @@ vgrow(void *vp, ulong len)
 	assert(v+1 && v->mag == VMag);
 	if (v->cap >= len)
 		return;
-	v1 = vnew(len, v->esz, v->alloc);
+	v1 = vnew(len, v->esz, v->pool);
 	memcpy(v1, v+1, v->cap * v->esz);
 	vfree(v+1);
 	*(Vec **)vp = v1;