* 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.
This commit is contained in:
parent
0c2e60193c
commit
30cc903e7c
6 changed files with 57 additions and 73 deletions
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue