From 4dd38ffd82e4e352e0d1619d7a9859dcacd81c1f Mon Sep 17 00:00:00 2001 From: Y_Less Date: Thu, 4 Oct 2018 13:59:30 +0200 Subject: [PATCH] `#pragma nodestruct var, names` --- source/compiler/sc.h | 1 + source/compiler/sc1.c | 2 +- source/compiler/sc2.c | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/source/compiler/sc.h b/source/compiler/sc.h index e417ae9..bf5b074 100644 --- a/source/compiler/sc.h +++ b/source/compiler/sc.h @@ -232,6 +232,7 @@ typedef struct s_symbol { #define uENUMFIELD 0x040 #define uMISSING 0x080 #define uFORWARD 0x100 +#define uNODESTRUCT 0x200 /* "no destruct(or)", not "node struct" */ /* uRETNONE is not stored in the "usage" field of a symbol. It is * used during parsing a function, to detect a mix of "return;" and * "return value;" in a few special cases. diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index fcec5ec..c6e38ec 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -4962,7 +4962,7 @@ static void destructsymbols(symbol *root,int level) int savepri=FALSE; symbol *sym=root->next; while (sym!=NULL && sym->compound>=level) { - if ((sym->ident==iVARIABLE || sym->ident==iARRAY) && !(sym->vclass==sSTATIC && sym->fnumber==-1)) { + if ((sym->ident==iVARIABLE || sym->ident==iARRAY) && !(sym->vclass==sSTATIC && sym->fnumber==-1) && !(sym->usage&uNODESTRUCT)) { char symbolname[16]; symbol *opsym; cell elements; diff --git a/source/compiler/sc2.c b/source/compiler/sc2.c index 3398c59..1cd81e8 100644 --- a/source/compiler/sc2.c +++ b/source/compiler/sc2.c @@ -1268,6 +1268,33 @@ static int command(void) if (comma) lptr++; } while (comma); + } else if (strcmp(str,"nodestruct")==0) { + char name[sNAMEMAX+1]; + int i,comma; + symbol *sym; + do { + /* get the name */ + while (*lptr<=' ' && *lptr!='\0') + lptr++; + for (i=0; iusage |= uNODESTRUCT; + } else { + error(17,name); /* undefined symbol */ + } /* if */ + /* see if a comma follows the name */ + while (*lptr<=' ' && *lptr!='\0') + lptr++; + comma= (*lptr==','); + if (comma) + lptr++; + } while (comma); } else if (strcmp(str,"naked")==0) { pc_naked=TRUE; } else if (strcmp(str,"warning")==0) {