[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