diff options
| author | 2022-10-09 00:03:16 +0200 | |
|---|---|---|
| committer | 2022-10-09 00:03:16 +0200 | |
| commit | e40132fa244acf71414739e9cc9321be2559e7d3 (patch) | |
| tree | b17ebb3a9381090a2f60a3b722f6de4a8482e08b | |
| parent | d6524cc6cd8091f9d1bdef10dc932012e10c4314 (diff) | |
do not store each objs size
| -rw-r--r-- | pez.c | 37 |
1 files changed, 30 insertions, 7 deletions
@@ -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); |