mirror of
https://github.com/TinyCC/tinycc.git
synced 2025-12-05 15:15:47 +00:00
Free all preprocessor memmory in case of error.
This commit is contained in:
87
tccpp.c
87
tccpp.c
@@ -115,13 +115,52 @@ ST_FUNC void expect(const char *msg)
|
|||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/* Custom allocator for tiny objects */
|
/* Custom allocator for tiny objects */
|
||||||
|
|
||||||
|
#define PP_ALLOC_INSERT(a) (a)->next = &pp_allocs; \
|
||||||
|
(a)->prev = pp_allocs.prev; \
|
||||||
|
pp_allocs.prev->next = (a); \
|
||||||
|
pp_allocs.prev = (a);
|
||||||
|
#define PP_ALLOC_REMOVE(a) (a)->next->prev = (a)->prev; \
|
||||||
|
(a)->prev->next = (a)->next;
|
||||||
|
|
||||||
|
typedef struct pp_alloc_t {
|
||||||
|
struct pp_alloc_t *next, *prev;
|
||||||
|
} pp_alloc_t;
|
||||||
|
|
||||||
|
static pp_alloc_t pp_allocs;
|
||||||
|
|
||||||
#define USE_TAL
|
#define USE_TAL
|
||||||
|
|
||||||
#ifndef USE_TAL
|
#ifndef USE_TAL
|
||||||
#define tal_free(al, p) tcc_free(p)
|
#define tal_free(al, p) tcc_free_impl(p)
|
||||||
#define tal_realloc(al, p, size) tcc_realloc(p, size)
|
#define tal_realloc(al, p, size) tcc_realloc_impl(p, size)
|
||||||
#define tal_new(a,b,c)
|
#define tal_new(a,b,c)
|
||||||
#define tal_delete(a)
|
#define tal_delete(a)
|
||||||
|
|
||||||
|
static void tcc_free_impl(void *p)
|
||||||
|
{
|
||||||
|
if (p) {
|
||||||
|
pp_alloc_t *alloc = ((pp_alloc_t *)p) - 1;
|
||||||
|
|
||||||
|
PP_ALLOC_REMOVE(alloc);
|
||||||
|
tcc_free(alloc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *tcc_realloc_impl(void *p, unsigned size)
|
||||||
|
{
|
||||||
|
pp_alloc_t *alloc = NULL;
|
||||||
|
|
||||||
|
if (p) {
|
||||||
|
alloc = ((pp_alloc_t *)p) - 1;
|
||||||
|
PP_ALLOC_REMOVE(alloc);
|
||||||
|
}
|
||||||
|
if (size) {
|
||||||
|
alloc = tcc_realloc(alloc, size + sizeof(pp_alloc_t));
|
||||||
|
PP_ALLOC_INSERT(alloc);
|
||||||
|
return alloc + 1;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
#if !defined(MEM_DEBUG)
|
#if !defined(MEM_DEBUG)
|
||||||
#define tal_free(al, p) tal_free_impl(al, p)
|
#define tal_free(al, p) tal_free_impl(al, p)
|
||||||
@@ -239,8 +278,12 @@ tail_call:
|
|||||||
al = al->next;
|
al = al->next;
|
||||||
goto tail_call;
|
goto tail_call;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
tcc_free(p);
|
pp_alloc_t *alloc = ((pp_alloc_t *)p) - 1;
|
||||||
|
|
||||||
|
PP_ALLOC_REMOVE(alloc);
|
||||||
|
tcc_free(alloc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *tal_realloc_impl(TinyAlloc **pal, void *p, unsigned size TAL_DEBUG_PARAMS)
|
static void *tal_realloc_impl(TinyAlloc **pal, void *p, unsigned size TAL_DEBUG_PARAMS)
|
||||||
@@ -303,8 +346,12 @@ tail_call:
|
|||||||
goto tail_call;
|
goto tail_call;
|
||||||
}
|
}
|
||||||
if (is_own) {
|
if (is_own) {
|
||||||
|
pp_alloc_t *alloc;
|
||||||
|
|
||||||
al->nb_allocs--;
|
al->nb_allocs--;
|
||||||
ret = tcc_malloc(size);
|
alloc = tcc_malloc(size + sizeof(pp_alloc_t));
|
||||||
|
PP_ALLOC_INSERT(alloc);
|
||||||
|
ret = alloc + 1;
|
||||||
header = (((tal_header_t *)p) - 1);
|
header = (((tal_header_t *)p) - 1);
|
||||||
if (p) memcpy(ret, p, header->size);
|
if (p) memcpy(ret, p, header->size);
|
||||||
#ifdef TAL_DEBUG
|
#ifdef TAL_DEBUG
|
||||||
@@ -313,8 +360,21 @@ tail_call:
|
|||||||
} else if (al->next) {
|
} else if (al->next) {
|
||||||
al = al->next;
|
al = al->next;
|
||||||
goto tail_call;
|
goto tail_call;
|
||||||
} else
|
} else {
|
||||||
ret = tcc_realloc(p, size);
|
pp_alloc_t *alloc = NULL;
|
||||||
|
|
||||||
|
if (p) {
|
||||||
|
alloc = ((pp_alloc_t *)p) - 1;
|
||||||
|
PP_ALLOC_REMOVE(alloc);
|
||||||
|
}
|
||||||
|
if (size) {
|
||||||
|
alloc = tcc_realloc(alloc, size + sizeof(pp_alloc_t));
|
||||||
|
PP_ALLOC_INSERT(alloc);
|
||||||
|
ret = alloc + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = NULL;
|
||||||
|
}
|
||||||
#ifdef TAL_INFO
|
#ifdef TAL_INFO
|
||||||
al->nb_missed++;
|
al->nb_missed++;
|
||||||
#endif
|
#endif
|
||||||
@@ -323,6 +383,17 @@ tail_call:
|
|||||||
|
|
||||||
#endif /* USE_TAL */
|
#endif /* USE_TAL */
|
||||||
|
|
||||||
|
static void tal_alloc_init(void)
|
||||||
|
{
|
||||||
|
pp_allocs.next = pp_allocs.prev = &pp_allocs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tal_alloc_free(void)
|
||||||
|
{
|
||||||
|
while (pp_allocs.next != &pp_allocs)
|
||||||
|
tal_free(toksym_alloc /* dummy */, pp_allocs.next + 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/* CString handling */
|
/* CString handling */
|
||||||
static void cstr_realloc(CString *cstr, int new_size)
|
static void cstr_realloc(CString *cstr, int new_size)
|
||||||
@@ -3748,6 +3819,7 @@ ST_FUNC void tccpp_new(TCCState *s)
|
|||||||
/* init allocators */
|
/* init allocators */
|
||||||
tal_new(&toksym_alloc, TOKSYM_TAL_LIMIT, TOKSYM_TAL_SIZE);
|
tal_new(&toksym_alloc, TOKSYM_TAL_LIMIT, TOKSYM_TAL_SIZE);
|
||||||
tal_new(&tokstr_alloc, TOKSTR_TAL_LIMIT, TOKSTR_TAL_SIZE);
|
tal_new(&tokstr_alloc, TOKSTR_TAL_LIMIT, TOKSTR_TAL_SIZE);
|
||||||
|
tal_alloc_init();
|
||||||
|
|
||||||
memset(hash_ident, 0, TOK_HASH_SIZE * sizeof(TokenSym *));
|
memset(hash_ident, 0, TOK_HASH_SIZE * sizeof(TokenSym *));
|
||||||
memset(s->cached_includes_hash, 0, sizeof s->cached_includes_hash);
|
memset(s->cached_includes_hash, 0, sizeof s->cached_includes_hash);
|
||||||
@@ -3803,6 +3875,7 @@ ST_FUNC void tccpp_delete(TCCState *s)
|
|||||||
tok_str_free_str(unget_buf.str);
|
tok_str_free_str(unget_buf.str);
|
||||||
|
|
||||||
/* free allocators */
|
/* free allocators */
|
||||||
|
tal_alloc_free();
|
||||||
tal_delete(toksym_alloc);
|
tal_delete(toksym_alloc);
|
||||||
toksym_alloc = NULL;
|
toksym_alloc = NULL;
|
||||||
tal_delete(tokstr_alloc);
|
tal_delete(tokstr_alloc);
|
||||||
|
|||||||
Reference in New Issue
Block a user