diff --git a/awk.h b/awk.h index 363e440..853163a 100644 --- a/awk.h +++ b/awk.h @@ -1323,12 +1323,25 @@ DEREF(NODE *r) #define get_lhs(n, r) (n)->type == Node_var && ! var_uninitialized(n) ? \ &((n)->var_value) : r_get_lhs((n), (r)) +#define MEMDEBUG + +#ifdef MEMDEBUG + +extern void *r_getblock(int id); +extern void r_freeblock(void *, int id); +#define getblock(p, id, ty) (void) (p = r_getblock(id)) +#define freeblock(p, id) (void) (r_freeblock(p, id)) + +#else + #define getblock(p, id, ty) (void) ((p = (ty) nextfree[id].freep) ? \ (ty) (nextfree[id].freep = ((struct block_item *) p)->freep) \ : (p = (ty) more_blocks(id))) #define freeblock(p, id) (void) (((struct block_item *) p)->freep = nextfree[id].freep, \ nextfree[id].freep = (struct block_item *) p) +#endif /* MEMDEBUG */ + #define getnode(n) getblock(n, BLOCK_NODE, NODE *) #define freenode(n) freeblock(n, BLOCK_NODE) diff --git a/node.c b/node.c index 9574c3e..049acc1 100644 --- a/node.c +++ b/node.c @@ -1034,6 +1034,31 @@ struct block_header nextfree[BLOCK_MAX] = { #endif }; +#ifdef MEMDEBUG + +void * +r_getblock(int id) +{ + void *res; + emalloc(res, void *, nextfree[id].size, "getblock"); +#if 0 + if (id == BLOCK_NODE) + fprintf(stderr, "allocated node %p\n", res); +#endif + return res; +} + +void +r_freeblock(void *p, int id) +{ +#if 0 + if (id == BLOCK_NODE) + fprintf(stderr, "freeing node %p\n", p); +#endif + free(p); +} + +#else /* more_blocks --- get more blocks of memory and add to the free list; size of a block must be >= sizeof(struct block_item) @@ -1064,3 +1089,5 @@ more_blocks(int id) nextfree[id].freep = freep->freep; return freep; } + +#endif