shithub: scc

Download patch

ref: 7acf1e8d391b8fea1b65700aa30bbf7ca27cc977
parent: 50dbcccb8762cbad40ebd87b42787c15d68c7c5b
author: Roberto E. Vargas Caballero <[email protected]>
date: Sat Mar 8 08:48:43 EST 2014

Remove cursym and the symbol stack

We can simplify everything if we return the symbol in directdcl and
declarator, so the stack is not needed.

--- a/decl.c
+++ b/decl.c
@@ -15,25 +15,24 @@
  * +1 for the function declaration
  * +1 for the field declaration
  */
-static struct symbol *symstack[NR_STRUCT_LEVEL + 1 + 1], **symstackp = symstack;
-static struct symbol *cursym;
 static unsigned char nr_tags = NS_TAG;
 static unsigned char nested_tags;
 
-static void declarator(struct ctype *tp, unsigned char ns);
+static struct symbol *declarator(struct ctype *tp, unsigned char ns);
 
-static void
+static struct symbol *
 directdcl(register struct ctype *tp, unsigned char ns)
 {
+	register struct symbol *sym;
+
 	if (accept('(')) {
-		declarator(tp, ns);
+		sym = declarator(tp, ns);
 		expect(')');
 	} else if (yytoken == IDEN) {
-		/* we can't overflow due to the check in structdcl */
-		*symstackp++ = cursym = lookup(yytext, ns);
-		if (!cursym->ctype.defined)
-			cursym->ctx = curctx;
-		else if (cursym->ctx == curctx)
+		sym = lookup(yytext, ns);
+		if (!sym->ctype.defined)
+			sym->ctx = curctx;
+		else if (sym->ctx == curctx)
 			error("redeclaration of '%s'", yytext);
 		next();
 	} else {
@@ -60,7 +59,7 @@
 			pushtype(len);
 			pushtype(ARY);
 		} else {
-			return;
+			return sym;
 		}
 	}
 }
@@ -108,6 +107,7 @@
 	struct storage store;
 	struct qualifier qlf;
 	register struct ctype *tp;
+	struct symbol *sym;
 
 	initctype(&base);
 	initstore(&store);
@@ -118,7 +118,7 @@
 		error("storage specifier in a struct/union field declaration");
 
 	do {
-		declarator(&base, ns);
+		sym = declarator(&base, ns);
 		tp = decl_type(&base);
 		if (accept(':')) {
 			expect(CONSTANT);
@@ -129,11 +129,11 @@
 				break;
 			default:
 				error("bit-field '%s' has invalid type",
-				      cursym->name);
+				      sym->name);
 			}
 		}
-		cursym->ctype = *tp;
-		cursym->qlf = qlf;
+		sym->ctype = *tp;
+		sym->qlf = qlf;
 	} while (accept(','));
 
 	expect(';');
@@ -269,11 +269,12 @@
 	return true;
 }
 
-static void
+static struct symbol *
 declarator(struct ctype *tp, unsigned char ns)
 {
 	unsigned char qlf[NR_DECLARATORS];
 	register unsigned char *bp, *lim;
+	struct symbol *sym;
 
 	lim = &qlf[NR_DECLARATORS];
 	for (bp = qlf; yytoken == '*' && bp != lim; ) {
@@ -294,10 +295,11 @@
 	if (bp == lim)
 		error("Too much type declarators");
 
-	directdcl(tp, ns);
+	sym = directdcl(tp, ns);
 
 	for (lim = bp, bp = qlf; bp < lim; ++bp)
 		pushtype(*bp);
+	return sym;
 }
 
 static struct node *
@@ -334,20 +336,20 @@
 	do {
 		struct node *np, *aux;
 		register struct ctype *tp;
+		register struct symbol *sym;
 
-		declarator(base, NS_IDEN);
-		cursym->store = *store;
-		cursym->qlf = *qlf;
-		cursym->ctype = *decl_type(base);
-		tp = &cursym->ctype;
+		sym = declarator(base, NS_IDEN);
+		sym->store = *store;
+		sym->qlf = *qlf;
+		sym->ctype = *decl_type(base);
+		tp = &sym->ctype;
 		if ((tp->type == STRUCT || tp->type == UNION) && tp->forward)
 			error("declaration of variable with incomplete type");
 
-		np = nodesym(cursym);
+		np = nodesym(sym);
 		fun = tp->type == FTN && yytoken == '{';
-		aux = fun ? function(cursym) : initializer(tp);
+		aux = fun ? function(sym) : initializer(tp);
 		addstmt(&c, node(ODEF, np, aux));
-		cursym = *--symstackp;
 	} while (!fun && accept(','));
 
 	if (!fun)