From 0b721bfa1cc4c63d366c0751f06e24f207092230 Mon Sep 17 00:00:00 2001 From: Stanislav Gromov Date: Sat, 17 Oct 2020 16:09:44 +0800 Subject: [PATCH] Reformat struct "assigninfo" into "symstate", so it could be used to store multiple symbol usage flags --- source/compiler/sc.h | 16 ++++++++-------- source/compiler/sc1.c | 4 ++-- source/compiler/sc2.c | 13 +++++++------ 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/source/compiler/sc.h b/source/compiler/sc.h index 15cbd87..4d3cf54 100644 --- a/source/compiler/sc.h +++ b/source/compiler/sc.h @@ -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); diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index 85dafe7..5cba80c 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -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 */ diff --git a/source/compiler/sc2.c b/source/compiler/sc2.c index aeb6029..50523aa 100644 --- a/source/compiler/sc2.c +++ b/source/compiler/sc2.c @@ -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 */