From 4024ccee4005cb81d25df364945f8895b8bace90 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Wed, 25 Mar 2009 13:06:29 -0300 Subject: [PATCH] tag: Make tag__delete call the right destructors for non-trivial types Signed-off-by: Arnaldo Carvalho de Melo --- dwarves.c | 15 ++++++++++++++- dwarves.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/dwarves.c b/dwarves.c index 27d7a8c..b6d2046 100644 --- a/dwarves.c +++ b/dwarves.c @@ -118,7 +118,20 @@ static size_t cacheline_size; void tag__delete(struct tag *self) { assert(list_empty(&self->node)); - free(self); + + switch (self->tag) { + case DW_TAG_union_type: + type__delete(tag__type(self)); break; + case DW_TAG_class_type: + case DW_TAG_structure_type: + class__delete(tag__class(self)); break; + case DW_TAG_enumeration_type: + enumeration__delete(tag__type(self)); break; + case DW_TAG_subroutine_type: + ftype__delete(tag__ftype(self)); break; + default: + free(self); + } } void tag__not_found_die(const char *file, int line, const char *func) diff --git a/dwarves.h b/dwarves.h index 3e21cf8..b3fcce6 100644 --- a/dwarves.h +++ b/dwarves.h @@ -242,6 +242,8 @@ struct tag { void *priv; }; +void tag__delete(struct tag *self); + static inline int tag__is_enumeration(const struct tag *self) { return self->tag == DW_TAG_enumeration_type;