summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pez.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/pez.c b/pez.c
index 2d9527b..80d2426 100644
--- a/pez.c
+++ b/pez.c
@@ -36,7 +36,7 @@ typedef struct Val {
}
typedef struct Obj Obj;
-#define OBJHEADER Obj *next; uint sz; short t : 8, gc : 1;
+#define OBJHEADER Obj *next; short t : 8, gc : 1;
struct Obj {
OBJHEADER;
@@ -299,9 +299,9 @@ cxfree(PezContext *cx, void *p, size_t sz)
cxrealloc(cx, p, sz, 0);
}
-#define delvec(cx, v) \
- ((v)->at ? cxfree(cx, (v)->at, (v)->cap * sizeof *(v)->at) : (void)0, \
- memset((v), 0, sizeof *(v)))
+#define delvec(cx, v) \
+ (void)((v)->at ? cxfree(cx, (v)->at, (v)->cap * sizeof *(v)->at) : (void)0, \
+ (v)->at = 0, (v)->cap = (v)->len = 0)
#define vecempty(v) ((v)->len == 0)
@@ -370,7 +370,6 @@ newobj(PezContext *cx, int type, size_t sz)
o->next = cx->heap;
cx->heap = o;
o->t = type;
- o->sz = sz;
return o;
}
@@ -440,6 +439,12 @@ newproto(PezContext *cx, const char *file, const char *name, int line)
return pr;
}
+static inline size_t
+sizeofproto(Proto *pr)
+{
+ return sizeof *pr + (pr->named ? strlen(pr->name) + 1 : 0);
+}
+
static void
delproto(PezContext *cx, Proto *pr)
{
@@ -457,6 +462,12 @@ newfn(PezContext *cx, Proto *pr)
return fn;
}
+static inline size_t
+sizeoffn(Fn *fn)
+{
+ return sizeof(*fn);
+}
+
static void
delfn(PezContext *cx, Fn *fn)
{
@@ -606,6 +617,12 @@ box_str(PezContext *cx, Val *pv, const char *s, int len)
return 1;
}
+static inline size_t
+sizeofstr(Str *str)
+{
+ return sizeof(*str) + str->n + 1;
+}
+
static Array *
newarr(PezContext *cx, uint cap)
{
@@ -634,7 +651,7 @@ arrpushn(PezContext *cx, Array *arr, Val *src, uint n)
static void
delarray(PezContext *cx, Array *arr)
{
- cxfree(cx, arr->at, arr->cap * sizeof(Val));
+ delvec(cx, arr);
}
static void
@@ -654,21 +671,27 @@ delstring(PezContext *cx, Str *str)
static void
freeobj(PezContext *cx, Obj *o)
{
+ size_t sz = 0;
switch (o->t) {
case PEZ_TFn:
+ sz = sizeoffn((Fn *)o);
delfn(cx, (Fn *)o);
break;
case PEZ_TFnProto:
+ sz = sizeofproto((Proto *)o);
delproto(cx, (Proto *)o);
break;
case PEZ_TArray:
+ sz = sizeof(Array);
delarray(cx, (Array *)o);
break;
case PEZ_TString:
+ sz = sizeofstr((Str *)o);
delstring(cx, (Str *)o);
break;
}
- cxfree(cx, o, o->sz);
+ assert(sz);
+ cxfree(cx, o, sz);
}
static void gcmark(PezContext *cx, Obj *o);