symbol.c (gfc_undo_symbols): Move code...

fortran/
	* symbol.c (gfc_undo_symbols): Move code...
	(restore_old_symbol): ... here as a new function.

From-SVN: r196412
This commit is contained in:
Mikael Morin 2013-03-03 17:21:07 +00:00
parent dd355a42fd
commit 718e305d0f
2 changed files with 67 additions and 53 deletions

View File

@ -1,7 +1,12 @@
2013-03-03 Mikael Morin <mikael@gcc.gnu.org>
* Make-lang.in (F95_PARSER_OBJS): Add dependency to vec.h
* gfortran.h: Include vec.h
* symbol.c (gfc_undo_symbols): Move code...
(restore_old_symbol): ... here as a new function.
2013-03-03 Mikael Morin <mikael@gcc.gnu.org>
* Make-lang.in (F95_PARSER_OBJS): Add dependency to vec.h.
* gfortran.h: Include vec.h.
(gfc_undo_change_set): New struct.
* symbol.c (tentative_tbp): Remove struct.
(changed_syms, tentative_tbp_list): Remove variables.

View File

@ -2879,6 +2879,64 @@ find_common_symtree (gfc_symtree *st, gfc_common_head *head)
}
/* Restore previous state of symbol. Just copy simple stuff. */
static void
restore_old_symbol (gfc_symbol *p)
{
gfc_symbol *old;
p->mark = 0;
old = p->old_symbol;
p->ts.type = old->ts.type;
p->ts.kind = old->ts.kind;
p->attr = old->attr;
if (p->value != old->value)
{
gfc_free_expr (old->value);
p->value = NULL;
}
if (p->as != old->as)
{
if (p->as)
gfc_free_array_spec (p->as);
p->as = old->as;
}
p->generic = old->generic;
p->component_access = old->component_access;
if (p->namelist != NULL && old->namelist == NULL)
{
gfc_free_namelist (p->namelist);
p->namelist = NULL;
}
else
{
if (p->namelist_tail != old->namelist_tail)
{
gfc_free_namelist (old->namelist_tail->next);
old->namelist_tail->next = NULL;
}
}
p->namelist_tail = old->namelist_tail;
if (p->formal != old->formal)
{
gfc_free_formal_arglist (p->formal);
p->formal = old->formal;
}
free (p->old_symbol);
p->old_symbol = NULL;
}
/* Undoes all the changes made to symbols in the current statement.
This subroutine is made simpler due to the fact that attributes are
never removed once added. */
@ -2886,7 +2944,7 @@ find_common_symtree (gfc_symtree *st, gfc_common_head *head)
void
gfc_undo_symbols (void)
{
gfc_symbol *p, *old;
gfc_symbol *p;
unsigned i;
FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
@ -2945,58 +3003,9 @@ gfc_undo_symbols (void)
gfc_delete_symtree (&p->ns->sym_root, p->name);
gfc_release_symbol (p);
continue;
}
/* Restore previous state of symbol. Just copy simple stuff. */
p->mark = 0;
old = p->old_symbol;
p->ts.type = old->ts.type;
p->ts.kind = old->ts.kind;
p->attr = old->attr;
if (p->value != old->value)
{
gfc_free_expr (old->value);
p->value = NULL;
}
if (p->as != old->as)
{
if (p->as)
gfc_free_array_spec (p->as);
p->as = old->as;
}
p->generic = old->generic;
p->component_access = old->component_access;
if (p->namelist != NULL && old->namelist == NULL)
{
gfc_free_namelist (p->namelist);
p->namelist = NULL;
}
else
{
if (p->namelist_tail != old->namelist_tail)
{
gfc_free_namelist (old->namelist_tail->next);
old->namelist_tail->next = NULL;
}
}
p->namelist_tail = old->namelist_tail;
if (p->formal != old->formal)
{
gfc_free_formal_arglist (p->formal);
p->formal = old->formal;
}
free (p->old_symbol);
p->old_symbol = NULL;
restore_old_symbol (p);
}
latest_undo_chgset->syms.truncate (0);