[master] 3129769 Try to boil symbol table interface down to only two functions.

Poul-Henning Kamp phk at FreeBSD.org
Tue Jan 30 11:01:08 UTC 2018


commit 3129769768102bd50d770bdaa2722d1b99b862fe
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Jan 30 10:15:58 2018 +0000

    Try to boil symbol table interface down to only two functions.

diff --git a/include/tbl/symbol_kind.h b/include/tbl/symbol_kind.h
index f71228b..5095ae3 100644
--- a/include/tbl/symbol_kind.h
+++ b/include/tbl/symbol_kind.h
@@ -31,6 +31,7 @@
 
 VCC_SYMB(NONE,		none)
 VCC_SYMB(ACL,		acl)
+VCC_SYMB(ACTION,	action)
 VCC_SYMB(BACKEND,	backend)
 VCC_SYMB(FUNC,		func)
 VCC_SYMB(INSTANCE,	instance)
diff --git a/lib/libvcc/generate.py b/lib/libvcc/generate.py
index 3b6dda7..6ae254d 100755
--- a/lib/libvcc/generate.py
+++ b/lib/libvcc/generate.py
@@ -1263,13 +1263,13 @@ def one_var(nm, spec):
 	ctyp = vcltypes[spec.typ]
 
 	# fo.write("\t{ \"%s\", %s,\n" % (nm, spec.typ))
-	fo.write("\tsym = VCC_Symbol(tl, NULL, \"%s\", NULL," % nm)
+	fo.write("\tsym = VCC_MkSym(tl, \"%s\", " % nm)
 	if (spec.typ == "HEADER"):
-		fo.write(" SYM_NONE, 1);\n")
+		fo.write(" SYM_NONE);\n")
 		fo.write("\tAN(sym);\n");
 		fo.write("\tsym->wildcard = vcc_Var_Wildcard;\n")
 	else:
-		fo.write(" SYM_VAR, 1);\n")
+		fo.write(" SYM_VAR);\n")
 	fo.write("\tAN(sym);\n")
 	fo.write("\tsym->fmt = %s;\n" % spec.typ)
 	fo.write("\tsym->eval = vcc_Eval_Var;\n")
diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index d131def..3724cdc 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -46,7 +46,7 @@ parse_call(struct vcc *tl)
 
 	vcc_NextToken(tl);
 	ExpectErr(tl, ID);
-	sym = VCC_SymbolGet(tl, SYM_SUB, NULL, XREF_REF);
+	sym = VCC_SymbolGet(tl, SYM_SUB, SYMTAB_CREATE, XREF_REF);
 	AN(sym);
 	vcc_AddCall(tl, sym);
 	VCC_GlobalSymbol(sym, SUB, "VGC_function");
@@ -368,7 +368,7 @@ parse_synthetic(struct vcc *tl)
 #define ACT(name, func, mask)						\
 	do {								\
 		const char pp[] = #name;				\
-		sym = VCC_Symbol(tl, NULL, pp, NULL, SYM_ACTION, 1);	\
+		sym = VCC_MkSym(tl, pp, SYM_ACTION);			\
 		AN(sym);						\
 		sym->action = func;					\
 		sym->action_mask = (mask);				\
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 7161b9d..3f9393b 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -723,8 +723,7 @@ VCC_New(void)
 	assert(tl->fh != NULL);
 
 	for (i = 1; i < VCL_MET_MAX; i++) {
-		sym = VCC_Symbol(tl, NULL,
-		    method_tab[i].name, NULL, SYM_SUB, 1);
+		sym = VCC_MkSym(tl, method_tab[i].name, SYM_SUB);
 		p = vcc_NewProc(tl, sym);
 		p->method = &method_tab[i];
 		VSB_printf(p->cname, "VGC_function_%s", p->method->name);
@@ -807,7 +806,7 @@ vcc_predef_vcl(struct vcc *vcc, const char *name)
 {
 	struct symbol *sym;
 
-	sym = VCC_Symbol(vcc, NULL, name, NULL, SYM_VCL, 1);
+	sym = VCC_MkSym(vcc, name, SYM_VCL);
 	AN(sym);
 	sym->fmt = VCL;
 	sym->r_methods = VCL_MET_RECV;
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index f590a8e..756a92f 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -314,12 +314,16 @@ void vcc_stevedore(struct vcc *vcc, const char *stv_name);
 
 /* vcc_symb.c */
 void VCC_PrintCName(struct vsb *vsb, const char *b, const char *e);
+struct symbol *VCC_MkSym(struct vcc *tl, const char *b, enum symkind kind);
 struct symbol *VCC_Symbol(struct vcc *, struct symbol *,
     const char *, const char *, enum symkind, int);
-enum xref_e {XREF_NONE, XREF_DEF, XREF_REF};
+extern const char XREF_NONE[];
+extern const char XREF_DEF[];
+extern const char XREF_REF[];
+extern const char SYMTAB_NOERR[];
+extern const char SYMTAB_CREATE[];
 struct symbol *VCC_SymbolGet(struct vcc *, enum symkind, const char *,
-    enum xref_e);
-struct symbol *VCC_SymbolTok(struct vcc *, enum symkind, int);
+    const char *);
 const char * VCC_SymKind(struct vcc *tl, const struct symbol *s);
 typedef void symwalk_f(struct vcc *tl, const struct symbol *s);
 void VCC_WalkSymbols(struct vcc *tl, symwalk_f *func, enum symkind kind);
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 0b1d7b6..2cf80e0 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -960,7 +960,7 @@ cmp_acl(struct vcc *tl, struct expr **e, const struct cmps *cp)
 
 	vcc_NextToken(tl);
 	vcc_ExpectVid(tl, "ACL");
-	sym = VCC_SymbolGet(tl, SYM_ACL, NULL, XREF_REF);
+	sym = VCC_SymbolGet(tl, SYM_ACL, SYMTAB_CREATE, XREF_REF);
 	AN(sym);
 	vcc_NextToken(tl);
 	VCC_GlobalSymbol(sym, ACL, ACL_SYMBOL_PREFIX);
@@ -1284,22 +1284,22 @@ vcc_Expr_Init(struct vcc *tl)
 {
 	struct symbol *sym;
 
-	sym = VCC_Symbol(tl, NULL, "regsub", NULL, SYM_FUNC, 1);
+	sym = VCC_MkSym(tl, "regsub", SYM_FUNC);
 	AN(sym);
 	sym->eval = vcc_Eval_Regsub;
 	sym->eval_priv = NULL;
 
-	sym = VCC_Symbol(tl, NULL, "regsuball", NULL, SYM_FUNC, 1);
+	sym = VCC_MkSym(tl, "regsuball", SYM_FUNC);
 	AN(sym);
 	sym->eval = vcc_Eval_Regsub;
 	sym->eval_priv = sym;
 
-	sym = VCC_Symbol(tl, NULL, "true", NULL, SYM_FUNC, 1);
+	sym = VCC_MkSym(tl, "true", SYM_FUNC);
 	AN(sym);
 	sym->eval = vcc_Eval_BoolConst;
 	sym->eval_priv = sym;
 
-	sym = VCC_Symbol(tl, NULL, "false", NULL, SYM_FUNC, 1);
+	sym = VCC_MkSym(tl, "false", SYM_FUNC);
 	AN(sym);
 	sym->eval = vcc_Eval_BoolConst;
 	sym->eval_priv = NULL;
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index 1d6fcb1..228a1d4 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -178,7 +178,7 @@ vcc_Compound(struct vcc *tl)
 			tl->err = 1;
 			return;
 		case ID:
-			sym = VCC_SymbolTok(tl, SYM_NONE, 0);
+			sym = VCC_SymbolGet(tl, SYM_NONE, SYMTAB_NOERR, XREF_NONE);
 			if (sym != NULL && sym->action != NULL) {
 				if (sym->action_mask != 0)
 					vcc_AddUses(tl, t, NULL,
@@ -220,7 +220,7 @@ vcc_ParseFunction(struct vcc *tl)
 	vcc_ExpectVid(tl, "function");
 	ERRCHK(tl);
 
-	sym = VCC_SymbolGet(tl, SYM_SUB, NULL, XREF_DEF);
+	sym = VCC_SymbolGet(tl, SYM_SUB, SYMTAB_CREATE, XREF_DEF);
 	AN(sym);
 	p = sym->proc;
 	if (p == NULL) {
diff --git a/lib/libvcc/vcc_storage.c b/lib/libvcc/vcc_storage.c
index ad03b01..8378234 100644
--- a/lib/libvcc/vcc_storage.c
+++ b/lib/libvcc/vcc_storage.c
@@ -84,7 +84,7 @@ vcc_stevedore(struct vcc *vcc, const char *stv_name)
 
 	CHECK_OBJ_NOTNULL(vcc, VCC_MAGIC);
 	bprintf(buf, "storage.%s", stv_name);
-	sym = VCC_Symbol(vcc, NULL, buf, NULL, SYM_VAR, 1);
+	sym = VCC_MkSym(vcc, buf, SYM_VAR);
 	AN(sym);
 	sym->fmt = STEVEDORE;
 	sym->eval = vcc_Eval_Var;
@@ -94,7 +94,7 @@ vcc_stevedore(struct vcc *vcc, const char *stv_name)
 
 	for (sv = stvars; sv->name != NULL; sv++) {
 		bprintf(buf, "storage.%s.%s", stv_name, sv->name);
-		sym = VCC_Symbol(vcc, NULL, buf, NULL, SYM_VAR, 1);
+		sym = VCC_MkSym(vcc, buf, SYM_VAR);
 		AN(sym);
 		sym->fmt = sv->fmt;
 		sym->eval = vcc_Eval_Var;
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 4078619..b083191 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -104,42 +104,47 @@ vcc_new_symbol(struct vcc *tl, const char *b, const char *e)
 	return (sym);
 }
 
+const char XREF_NONE[] = "xref_none";
+const char XREF_DEF[] = "xref_def";
+const char XREF_REF[] = "xref_ref";
+const char SYMTAB_NOERR[] = "sym_noerror";
+const char SYMTAB_CREATE[] = "sym_create";
+
 struct symbol *
-VCC_SymbolGet(struct vcc *tl, enum symkind kind, const char *err,
-    enum xref_e xrf)
+VCC_SymbolGet(struct vcc *tl, enum symkind kind, const char *e, const char *x)
 {
 	struct symbol *sym;
 
-	sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind, err == NULL);
+	AN(e);
+	sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind,
+	    e == SYMTAB_CREATE ? 1 : 0);
+	if (sym == NULL && e == SYMTAB_NOERR)
+		return (sym);
 	if (sym == NULL || (kind != SYM_NONE && sym->kind != kind)) {
-		VSB_printf(tl->sb, "%s: ", err);
+		VSB_printf(tl->sb, "%s: ", e);
 		vcc_ErrToken(tl, tl->t);
 		VSB_cat(tl->sb, "\nAt: ");
 		vcc_ErrWhere(tl, tl->t);
 		return (NULL);
 	}
-	switch (xrf) {
-	case XREF_DEF:
+	if (x == XREF_DEF) {
 		if (sym->def_b == NULL)
 			sym->def_b = tl->t;
 		sym->ndef++;
-		break;
-	case XREF_REF:
+	} else if (x == XREF_REF) {
 		if (sym->ref_b == NULL)
 			sym->ref_b = tl->t;
 		sym->nref++;
-		break;
-	default:
-		break;
+	} else {
+		assert (x == XREF_NONE);
 	}
 	return (sym);
 }
 
 struct symbol *
-VCC_SymbolTok(struct vcc *tl, enum symkind kind, int create)
+VCC_MkSym(struct vcc *tl, const char *b, enum symkind kind)
 {
-
-	return (VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind, create));
+	return (VCC_Symbol(tl, NULL, b, NULL, kind, 1));
 }
 
 struct symbol *
@@ -273,7 +278,7 @@ VCC_HandleSymbol(struct vcc *tl, vcc_type_t fmt, const char *pfx)
 	kind = VCC_HandleKind(fmt);
 	assert(kind != SYM_NONE);
 
-	sym = VCC_SymbolTok(tl, SYM_NONE, 0);
+	sym = VCC_SymbolGet(tl, SYM_NONE, SYMTAB_NOERR, XREF_NONE);
 	if (sym != NULL && sym->def_b != NULL && kind == sym->kind) {
 		p = VCC_SymKind(tl, sym);
 		VSB_printf(tl->sb, "%c%s '%.*s' redefined.\n",
@@ -298,7 +303,7 @@ VCC_HandleSymbol(struct vcc *tl, vcc_type_t fmt, const char *pfx)
 		return (sym);
 	}
 	if (sym == NULL)
-		sym = VCC_SymbolTok(tl, kind, 1);
+		sym = VCC_SymbolGet(tl, kind, SYMTAB_CREATE, XREF_NONE);
 	AN(sym);
 	AZ(sym->ndef);
 	VCC_GlobalSymbol(sym, fmt, pfx);
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index 67d82f9..239aa88 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -75,7 +75,7 @@ vcc_ParseImport(struct vcc *tl)
 
 	ExpectErr(tl, ID);
 	mod = tl->t;
-	osym = VCC_SymbolTok(tl, SYM_NONE, 0);
+	osym = VCC_SymbolGet(tl, SYM_NONE, SYMTAB_NOERR, XREF_NONE);
 	vcc_NextToken(tl);
 
 	if (osym != NULL && osym->kind != SYM_VMOD) {
@@ -94,7 +94,7 @@ vcc_ParseImport(struct vcc *tl)
 	}
 
 	bprintf(fn, "%.*s", PF(mod));
-	msym = VCC_Symbol(tl, NULL, fn, NULL, SYM_VMOD, 1);
+	msym = VCC_MkSym(tl, fn, SYM_VMOD);
 	ERRCHK(tl);
 	AN(msym);
 	msym->def_b = t1;
@@ -223,7 +223,7 @@ vcc_ParseImport(struct vcc *tl)
 		p = *spec;
 		if (!strcmp(p, "$OBJ")) {
 			p += strlen(p) + 1;
-			sym = VCC_Symbol(tl, NULL, p, NULL, SYM_OBJECT, 1);
+			sym = VCC_MkSym(tl, p, SYM_OBJECT);
 			XXXAN(sym);
 			sym->extra = p;
 			sym->vmod = msym->name;
@@ -242,7 +242,7 @@ vcc_ParseImport(struct vcc *tl)
 			    p, PF(mod));
 		} else if (!strcmp(p, "$FUNC")) {
 			p += strlen(p) + 1;
-			sym = VCC_Symbol(tl, NULL, p, NULL, SYM_FUNC, 1);
+			sym = VCC_MkSym(tl, p, SYM_FUNC);
 			ERRCHK(tl);
 			AN(sym);
 			sym->vmod = msym->name;
@@ -333,7 +333,7 @@ vcc_ParseNew(struct vcc *tl)
 	while (*p != '\0') {
 		p += strlen(s_obj);
 		bprintf(buf2, "%s%s", sy1->name, p);
-		sy3 = VCC_Symbol(tl, NULL, buf2, NULL, SYM_FUNC, 1);
+		sy3 = VCC_MkSym(tl, buf2, SYM_FUNC);
 		AN(sy3);
 		sy3->eval = vcc_Eval_SymFunc;
 		p += strlen(p) + 1;


More information about the varnish-commit mailing list