summaryrefslogtreecommitdiff
path: root/src/upb_table.c
diff options
context:
space:
mode:
authorJoshua Haberman <joshua@reverberate.org>2009-12-21 10:48:01 -0800
committerJoshua Haberman <joshua@reverberate.org>2009-12-21 10:48:01 -0800
commitc2419764856e5666bfa9e3c1b87de29ec93babe1 (patch)
tree7771bf0bbcf9b1103a55b963831385b07705b739 /src/upb_table.c
parentc6cba2af37638cc47ff69aed866669567ef365d9 (diff)
In the midst of a major refactoring.
Diffstat (limited to 'src/upb_table.c')
-rw-r--r--src/upb_table.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/upb_table.c b/src/upb_table.c
index 2c4c824..e73c6f4 100644
--- a/src/upb_table.c
+++ b/src/upb_table.c
@@ -47,7 +47,14 @@ void upb_strtable_init(struct upb_strtable *t, uint32_t size, uint16_t entsize)
void upb_table_free(struct upb_table *t) { free(t->entries); }
void upb_inttable_free(struct upb_inttable *t) { upb_table_free(&t->t); }
-void upb_strtable_free(struct upb_strtable *t) { upb_table_free(&t->t); }
+void upb_strtable_free(struct upb_strtable *t) {
+ // Free refs from the strtable.
+ struct upb_strtable_entry *e = upb_strtable_begin(t);
+ for(; e; e = upb_strtable_next(&m->ntof, e)) {
+ upb_string_unref(e->key);
+ }
+ upb_table_free(&t->t);
+}
static uint32_t strtable_bucket(struct upb_strtable *t, struct upb_string *key)
{
@@ -150,6 +157,7 @@ static uint32_t empty_strbucket(struct upb_strtable *table)
static void strinsert(struct upb_strtable *t, struct upb_strtable_entry *e)
{
assert(upb_strtable_lookup(t, e->key) == NULL);
+ e->key = upb_string_getref(e->key, UPB_REF_FROZEN);
t->t.count++;
uint32_t bucket = strtable_bucket(t, e->key);
struct upb_strtable_entry *table_e = strent(t, bucket);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback