diff --git a/vvp/class_type.cc b/vvp/class_type.cc index 2b925b64a..9606d4ca2 100644 --- a/vvp/class_type.cc +++ b/vvp/class_type.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 Stephen Williams (steve@icarus.com) + * Copyright (c) 2012-2013 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -20,6 +20,10 @@ # include "class_type.h" # include "compile.h" # include "vpi_priv.h" +# include "config.h" +#ifdef CHECK_WITH_VALGRIND +# include "vvp_cleanup.h" +#endif # include using namespace std; @@ -55,6 +59,8 @@ void compile_class_property(unsigned idx, char*nam, char*typ) { assert(compile_class); compile_class->set_property(idx, nam); + delete[]nam; + delete[]typ; } void compile_class_done(void) @@ -64,3 +70,10 @@ void compile_class_done(void) scope->classes[compile_class->class_name()] = compile_class; compile_class = 0; } + +#ifdef CHECK_WITH_VALGRIND +void class_def_delete(class_type *item) +{ + delete item; +} +#endif diff --git a/vvp/vpi_scope.cc b/vvp/vpi_scope.cc index a2b5d5976..3fa5ff52d 100644 --- a/vvp/vpi_scope.cc +++ b/vvp/vpi_scope.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2012 Stephen Williams (steve@icarus.com) + * Copyright (c) 2001-2013 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -116,6 +116,14 @@ static void delete_sub_scopes(struct __vpiScope *scope) } } free(scope->intern); + + /* Clean up any class definitions. */ + map::iterator citer; + for (citer = scope->classes.begin(); + citer != scope->classes.end(); ++ citer ) { + class_def_delete(citer->second); + } + scope->classes.clear(); } void root_table_delete(void) diff --git a/vvp/vvp_cleanup.h b/vvp/vvp_cleanup.h index 7f4237643..c5de97967 100644 --- a/vvp/vvp_cleanup.h +++ b/vvp/vvp_cleanup.h @@ -44,6 +44,7 @@ extern void A_delete(class __vpiHandle *item); extern void APV_delete(class __vpiHandle *item); extern void PV_delete(class __vpiHandle *item); extern void class_delete(class __vpiHandle *item); +extern void class_def_delete(class_type *item); extern void constant_delete(class __vpiHandle *item); extern void contexts_delete(struct __vpiScope *scope); extern void darray_delete(class __vpiHandle *item); @@ -62,6 +63,7 @@ extern void exec_ufunc_delete(vvp_code_t euf_code); extern void vthreads_delete(struct __vpiScope*scope); extern void vvp_net_delete(vvp_net_t *item); + extern void pool_local_net(vvp_net_t *net); #endif