[master] 4d3c70c Unify symbol table access through a single function

Poul-Henning Kamp phk at FreeBSD.org
Mon Jun 6 15:09:07 CEST 2016


commit 4d3c70c7e274abd9dc68f3059cafc27c17213f65
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jun 6 13:08:01 2016 +0000

    Unify symbol table access through a single function

diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index e089afd..d81c73a 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -158,7 +158,7 @@ parse_new(struct vcc *tl)
 	ExpectErr(tl, ID);
 	vcc_ExpectCid(tl, "VCL object");
 	ERRCHK(tl);
-	sy1 = VCC_FindSymbol(tl, tl->t, SYM_NONE);
+	sy1 = VCC_SymbolTok(tl, NULL, tl->t, SYM_NONE, 0);
 	if (sy1 != NULL) {
 		VSB_printf(tl->sb, "Object name '%.*s' already used.\n",
 		    PF(tl->t));
@@ -174,7 +174,7 @@ parse_new(struct vcc *tl)
 		return;
 	}
 
-	sy1 = VCC_AddSymbolTok(tl, tl->t, SYM_INSTANCE);
+	sy1 = VCC_SymbolTok(tl, NULL, tl->t, SYM_INSTANCE, 1);
 	XXXAN(sy1);
 	sy1->def_b = tl->t;
 	vcc_NextToken(tl);
@@ -183,7 +183,7 @@ parse_new(struct vcc *tl)
 	vcc_NextToken(tl);
 
 	ExpectErr(tl, ID);
-	sy2 = VCC_FindSymbol(tl, tl->t, SYM_OBJECT);
+	sy2 = VCC_SymbolTok(tl, NULL, tl->t, SYM_OBJECT, 0);
 	if (sy2 == NULL) {
 		VSB_printf(tl->sb, "Symbol not found: ");
 		vcc_ErrToken(tl, tl->t);
@@ -229,7 +229,7 @@ parse_new(struct vcc *tl)
 	while (*p != '\0') {
 		p += strlen(s_obj);
 		bprintf(buf2, "%s%s", sy1->name, p);
-		sy3 = VCC_AddSymbolStr(tl, buf2, SYM_FUNC);
+		sy3 = VCC_Symbol(tl, NULL, buf2, NULL, SYM_FUNC, 1);
 		AN(sy3);
 		sy3->eval = vcc_Eval_SymFunc;
 		p += strlen(p) + 1;
@@ -415,7 +415,7 @@ vcc_ParseAction(struct vcc *tl)
 			return (1);
 		}
 	}
-	sym = VCC_FindSymbol(tl, tl->t, SYM_NONE);
+	sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_NONE, 0);
 	if (sym != NULL && sym->kind == SYM_FUNC) {
 		vcc_Expr_Call(tl, sym);
 		return (1);
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index abf454d..5847e72 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -388,7 +388,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 			Fb(tl, 0, "\t.probe = &%s,\n", p);
 			ERRCHK(tl);
 		} else if (vcc_IdIs(t_field, "probe") && tl->t->tok == ID) {
-			if (VCC_FindSymbol(tl, tl->t, SYM_PROBE) == NULL) {
+			if (!VCC_SymbolTok(tl, NULL, tl->t, SYM_PROBE, 0)) {
 				VSB_printf(tl->sb, "Probe %.*s not found\n",
 				    PF(tl->t));
 				vcc_ErrWhere(tl, tl->t);
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 605aed3..1e11540 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -650,7 +650,7 @@ vcc_CompileSource(const struct vcp * const vcp, struct vsb *sb,
 	vcc_Expr_Init(tl);
 
 	VTAILQ_FOREACH(sym, &vcp->symbols, list) {
-		sym2 = VCC_AddSymbolStr(tl, sym->name, sym->kind);
+		sym2 = VCC_Symbol(tl, NULL, sym->name, NULL, sym->kind, 1);
 		sym2->fmt = sym->fmt;
 		sym2->eval = sym->eval;
 		sym2->eval_priv = sym->eval_priv;
@@ -662,11 +662,12 @@ vcc_CompileSource(const struct vcp * const vcp, struct vsb *sb,
 
 	for (v = vcc_vars; v->name != NULL; v++) {
 		if (v->fmt == HEADER) {
-			sym = VCC_AddSymbolStr(tl, v->name, SYM_WILDCARD);
+			sym = VCC_Symbol(tl, NULL, v->name, NULL,
+			    SYM_WILDCARD, 1);
 			sym->wildcard = vcc_Var_Wildcard;
 			sym->wildcard_priv = v;
 		} else {
-			sym = VCC_AddSymbolStr(tl, v->name, SYM_VAR);
+			sym = VCC_Symbol(tl, NULL, v->name, NULL, SYM_VAR, 1);
 		}
 		sym->fmt = v->fmt;
 		sym->eval = vcc_Eval_Var;
@@ -676,7 +677,7 @@ vcc_CompileSource(const struct vcp * const vcp, struct vsb *sb,
 		sym->lname = v->lname;
 	}
 
-	sym = VCC_AddSymbolStr(tl, "storage.", SYM_WILDCARD);
+	sym = VCC_Symbol(tl, NULL, "storage", NULL, SYM_WILDCARD, 1);
 	sym->wildcard = vcc_Stv_Wildcard;
 
 	Fh(tl, 0, "/* ---===### VCC generated .h code ###===---*/\n");
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index ac9cb0a..556eacf 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -315,13 +315,8 @@ void Resolve_Sockaddr(struct vcc *tl, const char *host, const char *defport,
 /* vcc_symb.c */
 struct symbol *VCC_Symbol(struct vcc *, struct symbol *,
     const char *, const char *, enum symkind, int);
-struct symbol *VCC_AddSymbolStr(struct vcc *tl, const char *name, enum symkind);
-struct symbol *VCC_AddSymbolTok(struct vcc *tl, const struct token *t,
-    enum symkind kind);
-struct symbol *VCC_GetSymbolTok(struct vcc *tl, const struct token *tok,
-    enum symkind);
-struct symbol *VCC_FindSymbol(struct vcc *tl,
-    const struct token *t, enum symkind kind);
+#define VCC_SymbolTok(vcc, sym, tok, kind, create) \
+    VCC_Symbol(vcc, sym, (tok)->b, (tok)->e, kind, create)
 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 90cd47e..4f8cfe2 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -814,13 +814,13 @@ vcc_expr4(struct vcc *tl, struct expr **e, enum var_type fmt)
 		sym = NULL;
 		kind = VCC_HandleKind(fmt);
 		if (kind != SYM_NONE)
-			sym = VCC_FindSymbol(tl, tl->t, kind);
+			sym = VCC_SymbolTok(tl, NULL, tl->t, kind, 0);
 		if (sym == NULL)
-			sym = VCC_FindSymbol(tl, tl->t, SYM_VAR);
+			sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_VAR, 0);
 		if (sym == NULL)
-			sym = VCC_FindSymbol(tl, tl->t, SYM_FUNC);
+			sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_FUNC, 0);
 		if (sym == NULL)
-			sym = VCC_FindSymbol(tl, tl->t, SYM_NONE);
+			sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_NONE, 0);
 		if (sym == NULL || sym->eval == NULL) {
 			VSB_printf(tl->sb, "Symbol not found: ");
 			vcc_ErrToken(tl, tl->t);
@@ -1409,22 +1409,22 @@ vcc_Expr_Init(struct vcc *tl)
 {
 	struct symbol *sym;
 
-	sym = VCC_AddSymbolStr(tl, "regsub", SYM_FUNC);
+	sym = VCC_Symbol(tl, NULL, "regsub", NULL, SYM_FUNC, 1);
 	AN(sym);
 	sym->eval = vcc_Eval_Regsub;
 	sym->eval_priv = NULL;
 
-	sym = VCC_AddSymbolStr(tl, "regsuball", SYM_FUNC);
+	sym = VCC_Symbol(tl, NULL, "regsuball", NULL, SYM_FUNC, 1);
 	AN(sym);
 	sym->eval = vcc_Eval_Regsub;
 	sym->eval_priv = sym;
 
-	sym = VCC_AddSymbolStr(tl, "true", SYM_FUNC);
+	sym = VCC_Symbol(tl, NULL, "true", NULL, SYM_FUNC, 1);
 	AN(sym);
 	sym->eval = vcc_Eval_BoolConst;
 	sym->eval_priv = sym;
 
-	sym = VCC_AddSymbolStr(tl, "false", SYM_FUNC);
+	sym = VCC_Symbol(tl, NULL, "false", NULL, SYM_FUNC, 1);
 	AN(sym);
 	sym->eval = vcc_Eval_BoolConst;
 	sym->eval_priv = NULL;
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index be40cc1..79c6798 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -158,49 +158,6 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent,
 	return (VCC_Symbol(tl, sym, ++q, e, kind, create));
 }
 
-static struct symbol *
-vcc_AddSymbol(struct vcc *tl, const char *nb, int l, enum symkind kind)
-{
-
-	return(VCC_Symbol(tl, NULL, nb, nb + l, kind, 1));
-}
-
-struct symbol *
-VCC_AddSymbolStr(struct vcc *tl, const char *name, enum symkind kind)
-{
-
-	return (vcc_AddSymbol(tl, name, strlen(name), kind));
-}
-
-struct symbol *
-VCC_AddSymbolTok(struct vcc *tl, const struct token *t, enum symkind kind)
-{
-
-	return (vcc_AddSymbol(tl, t->b, t->e - t->b, kind));
-}
-
-struct symbol *
-VCC_GetSymbolTok(struct vcc *tl, const struct token *tok, enum symkind kind)
-{
-	struct symbol *sym;
-
-	sym = VCC_FindSymbol(tl, tok, kind);
-	if (sym == NULL) {
-		sym = vcc_AddSymbol(tl, tok->b, tok->e - tok->b, kind);
-		AN(sym);
-		sym->def_b = tok;
-	}
-	return (sym);
-}
-
-struct symbol *
-VCC_FindSymbol(struct vcc *tl, const struct token *t, enum symkind kind)
-{
-
-	assert(t->tok == ID);
-	return (VCC_Symbol(tl, NULL, t->b, t->e, kind, 0));
-}
-
 static void
 vcc_walksymbols(struct vcc *tl, const struct symbol *root,
     symwalk_f *func, enum symkind kind)
@@ -272,7 +229,9 @@ VCC_HandleSymbol(struct vcc *tl, const struct token *tk, enum var_type fmt,
 	kind = VCC_HandleKind(fmt);
 	assert(kind != SYM_NONE);
 
-	sym = VCC_GetSymbolTok(tl, tk, kind);
+	sym = VCC_SymbolTok(tl, NULL, tk, kind, 1);
+	if (sym->def_b == NULL)
+		sym->def_b = tk;
 	AN(sym);
 	if (sym->ndef > 0) {
 		p = VCC_SymKind(tl, sym);
diff --git a/lib/libvcc/vcc_var.c b/lib/libvcc/vcc_var.c
index 3f4ef81..eac452d 100644
--- a/lib/libvcc/vcc_var.c
+++ b/lib/libvcc/vcc_var.c
@@ -99,7 +99,7 @@ vcc_FindVar(struct vcc *tl, const struct token *t, int wr_access,
 {
 	const struct symbol *sym;
 
-	sym = VCC_FindSymbol(tl, t, SYM_VAR);
+	sym = VCC_SymbolTok(tl, NULL, t, SYM_VAR, 0);
 	if (sym != NULL) {
 		if (wr_access && sym->w_methods == 0) {
 			VSB_printf(tl->sb, "Variable ");
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index 07995c3..77eefee 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -80,7 +80,7 @@ vcc_ParseImport(struct vcc *tl)
 	mod = tl->t;
 	vcc_NextToken(tl);
 
-	osym = VCC_FindSymbol(tl, mod, SYM_NONE);
+	osym = VCC_SymbolTok(tl, NULL, mod, SYM_NONE, 0);
 	if (osym != NULL && osym->kind != SYM_VMOD) {
 		VSB_printf(tl->sb, "Module %.*s conflicts with other symbol.\n",
 		    PF(mod));
@@ -97,7 +97,7 @@ vcc_ParseImport(struct vcc *tl)
 	}
 
 	bprintf(fn, "%.*s", PF(mod));
-	msym = VCC_AddSymbolStr(tl, fn, SYM_VMOD);
+	msym = VCC_Symbol(tl, NULL, fn, NULL, SYM_VMOD, 1);
 	ERRCHK(tl);
 	AN(msym);
 	msym->def_b = t1;
@@ -220,7 +220,7 @@ vcc_ParseImport(struct vcc *tl)
 		p = *spec;
 		if (!strcmp(p, "$OBJ")) {
 			p += strlen(p) + 1;
-			sym = VCC_AddSymbolStr(tl, p, SYM_OBJECT);
+			sym = VCC_Symbol(tl, NULL, p, NULL, SYM_OBJECT, 1);
 			XXXAN(sym);
 			sym->args = p;
 			sym->vmod = msym->name;
@@ -239,7 +239,7 @@ vcc_ParseImport(struct vcc *tl)
 			    p, PF(mod));
 		} else if (!strcmp(p, "$FUNC")) {
 			p += strlen(p) + 1;
-			sym = VCC_AddSymbolStr(tl, p, SYM_FUNC);
+			sym = VCC_Symbol(tl, NULL, p, NULL, SYM_FUNC, 1);
 			ERRCHK(tl);
 			AN(sym);
 			sym->vmod = msym->name;
diff --git a/lib/libvcc/vcc_xref.c b/lib/libvcc/vcc_xref.c
index 5440829..989a87d 100644
--- a/lib/libvcc/vcc_xref.c
+++ b/lib/libvcc/vcc_xref.c
@@ -78,7 +78,7 @@ vcc_AddRef(struct vcc *tl, const struct token *t, enum symkind kind)
 {
 	struct symbol *sym;
 
-	sym = VCC_GetSymbolTok(tl, t, kind);
+	sym = VCC_SymbolTok(tl, NULL, t, kind, 1);
 	AN(sym);
 	sym->nref++;
 }
@@ -88,7 +88,9 @@ vcc_AddDef(struct vcc *tl, const struct token *t, enum symkind kind)
 {
 	struct symbol *sym;
 
-	sym = VCC_GetSymbolTok(tl, t, kind);
+	sym = VCC_SymbolTok(tl, NULL, t, kind, 1);
+	if (sym->def_b == NULL)
+		sym->def_b = t;
 	AN(sym);
 	sym->ndef++;
 	return (sym->ndef);
@@ -134,7 +136,7 @@ vcc_findproc(struct vcc *tl, struct token *t)
 	struct proc *p;
 
 
-	sym = VCC_GetSymbolTok(tl, t, SYM_SUB);
+	sym = VCC_SymbolTok(tl, NULL, t, SYM_SUB, 1);
 	AN(sym);
 	if (sym->proc != NULL)
 		return (sym->proc);



More information about the varnish-commit mailing list