Reformat struct "assigninfo" into "symstate", so it could be used to store multiple symbol usage flags

This commit is contained in:
Stanislav Gromov 2020-10-17 16:09:44 +08:00
parent 355b324df4
commit 0b721bfa1c
3 changed files with 17 additions and 16 deletions

View File

@ -302,15 +302,15 @@ typedef struct s_valuepair {
long second;
} valuepair;
/* struct "assigninfo" is used to synchronize the status of assignments that
* were made in multiple "if" and "switch" branches, so the compiler could
* detect unused assignments in all of those branches, not only the last one */
/* struct "symstate" is used to:
* * synchronize the status of assignments between all "if" branches or "switch"
* cases, so the compiler could detect unused assignments in all of those
* branches/cases, not only in the last one */
typedef struct s_assigninfo {
int unused; /* true if the variable has an unused value assigned to it
* in one of the branches" */
int lnumber; /* line number of the first unused assignment made in one of
* the branches (used for error messages) */
} assigninfo;
short usage; /* usage flags to memoize (currently only uASSIGNED) */
} symstate;
/* macros for code generation */
#define opcodes(n) ((n)*sizeof(cell)) /* opcode size */
@ -735,8 +735,8 @@ SC_FUNC int refer_symbol(symbol *entry,symbol *bywhom);
SC_FUNC void markusage(symbol *sym,int usage);
SC_FUNC void markinitialized(symbol *sym,int assignment);
SC_FUNC void clearassignments(int fromlevel);
SC_FUNC void memoizeassignments(int fromlevel,assigninfo **assignments);
SC_FUNC void restoreassignments(int fromlevel,assigninfo *assignments);
SC_FUNC void memoizeassignments(int fromlevel,symstate **assignments);
SC_FUNC void restoreassignments(int fromlevel,symstate *assignments);
SC_FUNC void rename_symbol(symbol *sym,const char *newname);
SC_FUNC symbol *findglb(const char *name,int filter);
SC_FUNC symbol *findloc(const char *name);

View File

@ -5884,7 +5884,7 @@ static int doif(void)
int ifindent;
int lastst_true;
int returnst=tIF;
assigninfo *assignments=NULL;
symstate *assignments=NULL;
lastst=0; /* reset the last statement */
ifindent=stmtindent; /* save the indent of the "if" instruction */
@ -6104,7 +6104,7 @@ static int doswitch(void)
constvalue_root caselist = { NULL, NULL}; /* case list starts empty */
constvalue *cse,*csp,*newval;
char labelname[sNAMEMAX+1];
assigninfo *assignments=NULL;
symstate *assignments=NULL;
endtok= matchtoken('(') ? ')' : tDO;
ident=doexpr(TRUE,FALSE,FALSE,FALSE,&swtag,NULL,TRUE,NULL); /* evaluate switch expression */

View File

@ -3350,7 +3350,7 @@ SC_FUNC void clearassignments(int fromlevel)
}
/* memoizes all assignments done on the specified compound level and higher */
SC_FUNC void memoizeassignments(int fromlevel,assigninfo **assignments)
SC_FUNC void memoizeassignments(int fromlevel,symstate **assignments)
{
symbol *sym;
int num;
@ -3370,7 +3370,7 @@ SC_FUNC void memoizeassignments(int fromlevel,assigninfo **assignments)
/* if there are no variables, then we have an early exit */
if (num==0)
return;
*assignments=(assigninfo *)calloc((size_t)num,sizeof(assigninfo));
*assignments=(symstate *)calloc((size_t)num,sizeof(symstate));
if (*assignments==NULL)
error(103); /* insufficient memory */
} /* if */
@ -3385,16 +3385,17 @@ SC_FUNC void memoizeassignments(int fromlevel,assigninfo **assignments)
sym->usage &= ~uASSIGNED;
/* memoize the assignment only if there was no other unused assignment
* in any other "if" or "switch" branch */
if ((*assignments)[num].unused==FALSE) {
(*assignments)[num].unused=TRUE;
assert_static(sizeof(sym->usage)==sizeof((*assignments)->usage));
if (((*assignments)[num].usage & uASSIGNED)==0) {
(*assignments)[num].lnumber=sym->lnumber;
(*assignments)[num].usage |= uASSIGNED;
} /* if */
} /* if */
} /* for */
}
/* restores all memoized assignments */
SC_FUNC void restoreassignments(int fromlevel,assigninfo *assignments)
SC_FUNC void restoreassignments(int fromlevel,symstate *assignments)
{
symbol *sym;
int num;
@ -3402,7 +3403,7 @@ SC_FUNC void restoreassignments(int fromlevel,assigninfo *assignments)
sym=&loctab;
while ((sym=sym->next)!=NULL && sym->ident==iLABEL) {} /* skip labels */
for (num=0; sym!=NULL; num++,sym=sym->next) {
if (assignments!=NULL && assignments[num].unused) {
if (assignments!=NULL && (assignments[num].usage & uASSIGNED)!=0) {
sym->usage |= uASSIGNED;
sym->lnumber=assignments[num].lnumber;
} /* if */