diff options
author | Tom Tromey <tromey@redhat.com> | 2011-04-04 15:11:19 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2011-04-04 15:11:19 +0000 |
commit | 30cc903e7cd4678ec556d5386be55c3c726b6a27 (patch) | |
tree | 0043b2abe6ef2f26dff87b8be35be09b8f9ca025 /gdb/jv-lang.c | |
parent | 0c2e60193cf41ec57f62a5640ed67e4291e8f815 (diff) | |
download | gdb-30cc903e7cd4678ec556d5386be55c3c726b6a27.zip gdb-30cc903e7cd4678ec556d5386be55c3c726b6a27.tar.gz gdb-30cc903e7cd4678ec556d5386be55c3c726b6a27.tar.bz2 |
* mdebugread.c (psymtab_to_symtab_1): Copy linetable to obstack.
(new_symtab): Don't set `free_code' on symtab.
(new_linetable): Properly handle size==0.
* symtab.h (struct symtab) <free_code, free_func>: Remove.
* symmisc.c (free_symtab): Don't free the linetable. Don't call
free_func.
* jv-lang.c (struct jv_per_objfile_data): New.
(jv_per_objfile_free): Free the data.
(get_dynamics_objfile): Allocate a jv_per_objfile_data.
(get_java_class_symtab): Set the `dict' field on the
jv_per_objfile_data.
(free_class_block): Remove.
* buildsym.c (end_symtab): Don't set `free_code' or `free_func' on
the symtab.
Diffstat (limited to 'gdb/jv-lang.c')
-rw-r--r-- | gdb/jv-lang.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index fb2c056..b613471 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -72,17 +72,30 @@ static struct symtab *class_symtab = NULL; static struct type *java_link_class_type (struct gdbarch *, struct type *, struct value *); +/* An instance of this structure is used to store some data that must + be freed. */ + +struct jv_per_objfile_data +{ + /* The expandable dictionary we use. */ + struct dictionary *dict; +}; + /* A function called when the dynamics_objfile is freed. We use this to clean up some internal state. */ static void -jv_per_objfile_free (struct objfile *objfile, void *ignore) +jv_per_objfile_free (struct objfile *objfile, void *data) { + struct jv_per_objfile_data *jv_data = data; + gdb_assert (objfile == dynamics_objfile); - /* Clean up all our cached state. These objects are all allocated - in the dynamics_objfile, so we don't need to actually free - anything. */ + /* Clean up all our cached state. */ dynamics_objfile = NULL; class_symtab = NULL; + + if (jv_data->dict) + dict_free (jv_data->dict); + xfree (jv_data); } /* FIXME: carlton/2003-02-04: This is the main or only caller of @@ -96,22 +109,19 @@ get_dynamics_objfile (struct gdbarch *gdbarch) { if (dynamics_objfile == NULL) { + struct jv_per_objfile_data *data; + /* Mark it as shared so that it is cleared when the inferior is re-run. */ dynamics_objfile = allocate_objfile (NULL, OBJF_SHARED); dynamics_objfile->gdbarch = gdbarch; - /* We don't have any data to store, but this lets us get a - notification when the objfile is destroyed. Since we have to - store a non-NULL value, we just pick something arbitrary and - safe. */ - set_objfile_data (dynamics_objfile, jv_dynamics_objfile_data_key, - &dynamics_objfile); + + data = XCNEW (struct jv_per_objfile_data); + set_objfile_data (dynamics_objfile, jv_dynamics_objfile_data_key, data); } return dynamics_objfile; } -static void free_class_block (struct symtab *symtab); - static struct symtab * get_java_class_symtab (struct gdbarch *gdbarch) { @@ -120,6 +130,7 @@ get_java_class_symtab (struct gdbarch *gdbarch) struct objfile *objfile = get_dynamics_objfile (gdbarch); struct blockvector *bv; struct block *bl; + struct jv_per_objfile_data *jv_data; class_symtab = allocate_symtab ("<java-classes>", objfile); class_symtab->language = language_java; @@ -139,7 +150,10 @@ get_java_class_symtab (struct gdbarch *gdbarch) bl = allocate_block (&objfile->objfile_obstack); BLOCK_DICT (bl) = dict_create_hashed_expandable (); BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl; - class_symtab->free_func = free_class_block; + + /* Arrange to free the dict. */ + jv_data = objfile_data (objfile, jv_dynamics_objfile_data_key); + jv_data->dict = BLOCK_DICT (bl); } return class_symtab; } @@ -172,16 +186,6 @@ add_class_symbol (struct type *type, CORE_ADDR addr) return sym; } -/* Free the dynamic symbols block. */ -static void -free_class_block (struct symtab *symtab) -{ - struct blockvector *bv = BLOCKVECTOR (symtab); - struct block *bl = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - - dict_free (BLOCK_DICT (bl)); -} - struct type * java_lookup_class (char *name) { |