case EXPR_FLOAT:
floatnum_delete(e->terms[i].data.flt);
break;
+ case EXPR_SYM:
+ /* call symrec_delete in case sym isn't in the symbol table */
+ symrec_delete(e->terms[i].data.sym);
+ break;
default:
break; /* none of the other types needs to be deleted */
}
union {
expr *expn; /* equ value */
struct label_s { /* bytecode immediately preceding a label */
- /*@dependent@*/ section *sect;
+ /*@dependent@*/ /*@null@*/ section *sect;
/*@dependent@*/ /*@null@*/ bytecode *bc;
} label;
} value;
sym_table = NULL;
}
+void
+symrec_delete(symrec *sym)
+{
+ /*@-branchstate@*/
+ if (sym->status & SYM_NOTINTABLE)
+ symrec_delete_one(sym);
+ /*@=branchstate@*/
+}
+
void
symrec_print(const symrec *sym)
{
break;
case SYM_LABEL:
printf("_Label_\n");
- printf("Section=`%s'\n", section_get_name(sym->value.label.sect));
+ printf("Section=`%s'\n", sym->value.label.sect?
+ section_get_name(sym->value.label.sect):"(nil)");
if (!sym->value.label.bc)
printf("[First bytecode]\n");
else {
/*@keep@*/ expr *e);
/* in_table specifies if the label should be inserted into the symbol table. */
/*@dependent@*/ symrec *symrec_define_label(const char *name,
- /*@dependent@*/ section *sect,
+ /*@dependent@*/ /*@null@*/
+ section *sect,
/*@dependent@*/ /*@null@*/
bytecode *precbc, int in_table);
/*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis);
void symrec_delete_all(void);
+/* Deletes symrec if it isn't in the symbol table. If it *is* in the symbol
+ * table, does nothing.
+ */
+void symrec_delete(/*@only@*/ symrec *sym);
+
void symrec_print(const symrec *sym);
#endif
case EXPR_FLOAT:
floatnum_delete(e->terms[i].data.flt);
break;
+ case EXPR_SYM:
+ /* call symrec_delete in case sym isn't in the symbol table */
+ symrec_delete(e->terms[i].data.sym);
+ break;
default:
break; /* none of the other types needs to be deleted */
}
union {
expr *expn; /* equ value */
struct label_s { /* bytecode immediately preceding a label */
- /*@dependent@*/ section *sect;
+ /*@dependent@*/ /*@null@*/ section *sect;
/*@dependent@*/ /*@null@*/ bytecode *bc;
} label;
} value;
sym_table = NULL;
}
+void
+symrec_delete(symrec *sym)
+{
+ /*@-branchstate@*/
+ if (sym->status & SYM_NOTINTABLE)
+ symrec_delete_one(sym);
+ /*@=branchstate@*/
+}
+
void
symrec_print(const symrec *sym)
{
break;
case SYM_LABEL:
printf("_Label_\n");
- printf("Section=`%s'\n", section_get_name(sym->value.label.sect));
+ printf("Section=`%s'\n", sym->value.label.sect?
+ section_get_name(sym->value.label.sect):"(nil)");
if (!sym->value.label.bc)
printf("[First bytecode]\n");
else {
/*@keep@*/ expr *e);
/* in_table specifies if the label should be inserted into the symbol table. */
/*@dependent@*/ symrec *symrec_define_label(const char *name,
- /*@dependent@*/ section *sect,
+ /*@dependent@*/ /*@null@*/
+ section *sect,
/*@dependent@*/ /*@null@*/
bytecode *precbc, int in_table);
/*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis);
void symrec_delete_all(void);
+/* Deletes symrec if it isn't in the symbol table. If it *is* in the symbol
+ * table, does nothing.
+ */
+void symrec_delete(/*@only@*/ symrec *sym);
+
void symrec_print(const symrec *sym);
#endif