From a3350a8100d185107a65c273744595234c398f99 Mon Sep 17 00:00:00 2001 From: Daniel Murphy Date: Fri, 16 Jan 2015 14:39:22 +1100 Subject: [PATCH] Don't call StringTable's destructor from the glue layer --- src/e2ir.c | 10 +++++++--- src/root/stringtable.c | 12 ++++++++++++ src/root/stringtable.h | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/e2ir.c b/src/e2ir.c index 7e14646eef33..fc6a1e22b8ee 100644 --- a/src/e2ir.c +++ b/src/e2ir.c @@ -854,9 +854,13 @@ StringTable *stringTab; void clearStringTab() { //printf("clearStringTab()\n"); - delete stringTab; - stringTab = new StringTable; - stringTab->_init(1000); // 1000 is arbitrary guess + if (stringTab) + stringTab->reset(1000); // 1000 is arbitrary guess + else + { + stringTab = new StringTable(); + stringTab->_init(1000); + } } elem *toElem(Expression *e, IRState *irs) diff --git a/src/root/stringtable.c b/src/root/stringtable.c index ce87ed687691..473916e7cec5 100644 --- a/src/root/stringtable.c +++ b/src/root/stringtable.c @@ -132,6 +132,18 @@ void StringTable::_init(size_t size) count = 0; } +void StringTable::reset(size_t size) +{ + for (size_t i = 0; i < npools; ++i) + mem.free(pools[i]); + + mem.free(table); + mem.free(pools); + table = NULL; + pools = NULL; + _init(size); +} + StringTable::~StringTable() { for (size_t i = 0; i < npools; ++i) diff --git a/src/root/stringtable.h b/src/root/stringtable.h index 2b7c8b5737e7..9847a1936035 100644 --- a/src/root/stringtable.h +++ b/src/root/stringtable.h @@ -46,6 +46,7 @@ struct StringTable public: void _init(size_t size = 0); + void reset(size_t size = 0); ~StringTable(); StringValue *lookup(const char *s, size_t len);