mems & leaks
- define_start: set above preprocess_start because now preprocess_start is defining macros. - free "cmd_include_files" - free defines always (after error-longjmps) - close all files (after error-longjmps) - tccpe.c: free imports always - libtcc.c: call tcc_memstats only after all states have been deleted.
This commit is contained in:
19
libtcc.c
19
libtcc.c
@ -32,6 +32,8 @@ ST_DATA int tcc_ext = 1;
|
||||
/* XXX: get rid of this ASAP */
|
||||
ST_DATA struct TCCState *tcc_state;
|
||||
|
||||
static int nb_states;
|
||||
|
||||
/********************************************************/
|
||||
|
||||
#ifdef ONE_SOURCE
|
||||
@ -509,6 +511,7 @@ static void error1(TCCState *s1, int is_warning, const char *fmt, va_list ap)
|
||||
/* default case: stderr */
|
||||
if (s1->ppfp) /* print a newline during tcc -E */
|
||||
fprintf(s1->ppfp, "\n"), fflush(s1->ppfp);
|
||||
fflush(stdout); /* flush -v output */
|
||||
fprintf(stderr, "%s\n", buf);
|
||||
fflush(stderr); /* print error/warning now (win32) */
|
||||
} else {
|
||||
@ -623,17 +626,18 @@ static int tcc_compile(TCCState *s1)
|
||||
{
|
||||
Sym *define_start;
|
||||
|
||||
preprocess_start(s1);
|
||||
define_start = define_stack;
|
||||
|
||||
if (setjmp(s1->error_jmp_buf) == 0) {
|
||||
s1->nb_errors = 0;
|
||||
s1->error_set_jmp_enabled = 1;
|
||||
|
||||
preprocess_start(s1);
|
||||
tccgen_start(s1);
|
||||
|
||||
#ifdef INC_DEBUG
|
||||
printf("%s: **** new file\n", file->filename);
|
||||
#endif
|
||||
|
||||
ch = file->buf_ptr[0];
|
||||
tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF;
|
||||
parse_flags = PARSE_FLAG_PREPROCESS | PARSE_FLAG_TOK_NUM | PARSE_FLAG_TOK_STR;
|
||||
@ -641,13 +645,17 @@ static int tcc_compile(TCCState *s1)
|
||||
decl(VT_CONST);
|
||||
if (tok != TOK_EOF)
|
||||
expect("declaration");
|
||||
/* reset define stack, but keep -D and built-ins */
|
||||
/* free defines here already on behalf of of M.M.'s possibly existing
|
||||
experimental preprocessor implementation. The normal call below
|
||||
is still there to free after error-longjmp */
|
||||
free_defines(define_start);
|
||||
tccgen_end(s1);
|
||||
}
|
||||
s1->error_set_jmp_enabled = 0;
|
||||
|
||||
free_inline_functions(s1);
|
||||
/* reset define stack, but keep -D and built-ins */
|
||||
free_defines(define_start);
|
||||
sym_pop(&global_stack, NULL, 0);
|
||||
sym_pop(&local_stack, NULL, 0);
|
||||
return s1->nb_errors != 0 ? -1 : 0;
|
||||
@ -724,6 +732,7 @@ LIBTCCAPI TCCState *tcc_new(void)
|
||||
if (!s)
|
||||
return NULL;
|
||||
tcc_state = s;
|
||||
++nb_states;
|
||||
|
||||
s->alacarte_link = 1;
|
||||
s->nocommon = 1;
|
||||
@ -897,6 +906,7 @@ LIBTCCAPI void tcc_delete(TCCState *s1)
|
||||
dynarray_reset(&s1->cached_includes, &s1->nb_cached_includes);
|
||||
dynarray_reset(&s1->include_paths, &s1->nb_include_paths);
|
||||
dynarray_reset(&s1->sysinclude_paths, &s1->nb_sysinclude_paths);
|
||||
dynarray_reset(&s1->cmd_include_files, &s1->nb_cmd_include_files);
|
||||
|
||||
tcc_free(s1->tcc_lib_path);
|
||||
tcc_free(s1->soname);
|
||||
@ -915,7 +925,8 @@ LIBTCCAPI void tcc_delete(TCCState *s1)
|
||||
#endif
|
||||
|
||||
tcc_free(s1);
|
||||
tcc_memstats(bench);
|
||||
if (0 == --nb_states)
|
||||
tcc_memstats(bench);
|
||||
}
|
||||
|
||||
LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type)
|
||||
|
||||
Reference in New Issue
Block a user