diff options
author | Tavian Barnes <tavianator@gmail.com> | 2010-02-09 21:41:44 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2010-02-09 21:41:44 -0500 |
commit | 4542f7a7449b4a6c8273ae15d6e854ead0dfe13a (patch) | |
tree | cf144f609a67bd3dc73c0dd30332e592f786f1e2 /dimension | |
parent | 7d3a45468b07356d6ca2863b59163b165a83a0f0 (diff) | |
download | dimension-4542f7a7449b4a6c8273ae15d6e854ead0dfe13a.tar.xz |
Don't leak memory on parse failures from within buffers.
Diffstat (limited to 'dimension')
-rw-r--r-- | dimension/grammar.epilogue | 2 | ||||
-rw-r--r-- | dimension/tokenize.c | 12 | ||||
-rw-r--r-- | dimension/tokenize.h | 1 |
3 files changed, 15 insertions, 0 deletions
diff --git a/dimension/grammar.epilogue b/dimension/grammar.epilogue index ecb910a..6ea4e28 100644 --- a/dimension/grammar.epilogue +++ b/dimension/grammar.epilogue @@ -43,6 +43,7 @@ dmnsn_parse(FILE *file, dmnsn_symbol_table *symtable) astree = NULL; } + dmnsn_yylex_cleanup(scanner); dmnsn_yylex_destroy(scanner); return astree; } @@ -73,6 +74,7 @@ dmnsn_parse_string(const char *str, dmnsn_symbol_table *symtable) astree = NULL; } + dmnsn_yylex_cleanup(scanner); dmnsn_yylex_destroy(scanner); return astree; } diff --git a/dimension/tokenize.c b/dimension/tokenize.c index 8d85b2d..7269fb4 100644 --- a/dimension/tokenize.c +++ b/dimension/tokenize.c @@ -788,3 +788,15 @@ dmnsn_yylex(dmnsn_parse_item *lvalp, dmnsn_parse_location *llocp, } } } + +void +dmnsn_yylex_cleanup(void *yyscanner) +{ + dmnsn_token_buffer *tbuffer = dmnsn_yyget_extra(yyscanner); + while (tbuffer) { + dmnsn_token_buffer *prev = tbuffer->prev; + dmnsn_delete_token_buffer(tbuffer); + tbuffer = prev; + } + dmnsn_yyset_extra(NULL, yyscanner); +} diff --git a/dimension/tokenize.h b/dimension/tokenize.h index 86be4c9..86ee5d1 100644 --- a/dimension/tokenize.h +++ b/dimension/tokenize.h @@ -63,6 +63,7 @@ void dmnsn_yy_pop_buffer(void *scanner); int dmnsn_yylex(dmnsn_parse_item *lvalp, dmnsn_parse_location *llocp, const char *filename, dmnsn_symbol_table *symtable, void *yyscanner); +void dmnsn_yylex_cleanup(void *yyscanner); /* For debugging - returns an array of raw tokens */ dmnsn_array *dmnsn_tokenize(FILE *file, const char *filename); |