* 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:
Tom Tromey
2011-04-04 15:11:19 +00:00
parent 0c2e60193c
commit 30cc903e7c
6 changed files with 57 additions and 73 deletions

View File

@@ -79,37 +79,11 @@ struct print_symbol_args
static int print_symbol (void *);
/* Free all the storage associated with the struct symtab <- S.
Note that some symtabs have contents that all live inside one big block of
memory, and some share the contents of another symbol table and so you
should not free the contents on their behalf (except sometimes the
linetable, which maybe per symtab even when the rest is not).
It is s->free_code that says which alternative to use. */
/* Free all the storage associated with the struct symtab <- S. */
void
free_symtab (struct symtab *s)
{
switch (s->free_code)
{
case free_nothing:
/* All the contents are part of a big block of memory (an obstack),
and some other symtab is in charge of freeing that block.
Therefore, do nothing. */
break;
case free_linetable:
/* Everything will be freed either by our `free_func'
or by some other symtab, except for our linetable.
Free that now. */
if (LINETABLE (s))
xfree (LINETABLE (s));
break;
}
/* If there is a single block of memory to free, free it. */
if (s->free_func != NULL)
s->free_func (s);
/* Free source-related stuff. */
if (s->line_charpos != NULL)
xfree (s->line_charpos);