[master] 5ba1c33 Refactoring of symbol table
Poul-Henning Kamp
phk at FreeBSD.org
Mon Jan 29 23:21:09 UTC 2018
commit 5ba1c33ebecffaa20e53e55801cae5ab86a0a2b3
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Jan 29 20:46:50 2018 +0000
Refactoring of symbol table
diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index 8f61bad..1e99ee9 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -47,7 +47,8 @@ parse_call(struct vcc *tl)
vcc_NextToken(tl);
ExpectErr(tl, ID);
vcc_AddCall(tl);
- sym = vcc_AddRef(tl, SYM_SUB);
+ sym = VCC_SymbolGet(tl, SYM_SUB, NULL, XREF_REF);
+ AN(sym);
VCC_GlobalSymbol(sym, SUB, "VGC_function");
Fb(tl, 1, "%s(ctx);\n", sym->rname);
vcc_NextToken(tl);
@@ -95,7 +96,7 @@ parse_set(struct vcc *tl)
vcc_NextToken(tl);
ExpectErr(tl, ID);
t = tl->t;
- sym = VCC_SymbolGet(tl, SYM_VAR, "Unknown variable");
+ sym = VCC_SymbolGet(tl, SYM_VAR, "Unknown variable", XREF_NONE);
ERRCHK(tl);
vcc_NextToken(tl);
AN(sym);
@@ -149,7 +150,7 @@ parse_unset(struct vcc *tl)
vcc_NextToken(tl);
ExpectErr(tl, ID);
t = tl->t;
- sym = VCC_SymbolGet(tl, SYM_VAR, "Unknown variable");
+ sym = VCC_SymbolGet(tl, SYM_VAR, "Unknown variable", XREF_NONE);
ERRCHK(tl);
vcc_NextToken(tl);
AN(sym);
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index 55e8ba9..db4d11c 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -389,11 +389,11 @@ 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) {
- pb = VCC_SymbolGet(tl, SYM_PROBE, "Probe not found");
+ pb = VCC_SymbolGet(tl, SYM_PROBE, "Probe not found",
+ XREF_REF);
ERRCHK(tl);
AN(pb);
Fb(tl, 0, "\t.probe = %s,\n", pb->rname);
- (void)vcc_AddRef(tl, SYM_PROBE);
vcc_NextToken(tl);
SkipToken(tl, ';');
} else if (vcc_IdIs(t_field, "probe")) {
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index cd96916..f510e68 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -310,7 +310,9 @@ void vcc_stevedore(struct vcc *vcc, const char *stv_name);
void VCC_PrintCName(struct vsb *vsb, const char *b, const char *e);
struct symbol *VCC_Symbol(struct vcc *, struct symbol *,
const char *, const char *, enum symkind, int);
-struct symbol *VCC_SymbolGet(struct vcc *, enum symkind, const char *);
+enum xref_e {XREF_NONE, XREF_DEF, XREF_REF};
+struct symbol *VCC_SymbolGet(struct vcc *, enum symkind, const char *,
+ enum xref_e);
struct symbol *VCC_SymbolTok(struct vcc *, enum symkind, int);
const char * VCC_SymKind(struct vcc *tl, const struct symbol *s);
typedef void symwalk_f(struct vcc *tl, const struct symbol *s);
@@ -344,7 +346,6 @@ void vcc_ParseImport(struct vcc *tl);
void vcc_ParseNew(struct vcc *tl);
/* vcc_xref.c */
-struct symbol *vcc_AddDef(struct vcc *, enum symkind);
struct symbol *vcc_AddRef(struct vcc *, enum symkind);
int vcc_CheckReferences(struct vcc *tl);
void VCC_XrefTable(struct vcc *);
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index f1666e6..810cb1e 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -966,7 +966,8 @@ cmp_acl(struct vcc *tl, struct expr **e, const struct cmps *cp)
vcc_NextToken(tl);
vcc_ExpectVid(tl, "ACL");
- sym = vcc_AddRef(tl, SYM_ACL);
+ sym = VCC_SymbolGet(tl, SYM_ACL, NULL, XREF_REF);
+ AN(sym);
vcc_NextToken(tl);
VCC_GlobalSymbol(sym, ACL, ACL_SYMBOL_PREFIX);
bprintf(buf, "%sVRT_acl_match(ctx, %s, \v1)", cp->emit, sym->rname);
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index a179d4a..569b3d8 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -215,7 +215,7 @@ vcc_ParseFunction(struct vcc *tl)
vcc_ExpectVid(tl, "function");
ERRCHK(tl);
- sym = vcc_AddDef(tl, SYM_SUB);
+ sym = VCC_SymbolGet(tl, SYM_SUB, NULL, XREF_DEF);
AN(sym);
p = sym->proc;
if (p == NULL) {
@@ -247,7 +247,6 @@ vcc_ParseFunction(struct vcc *tl)
/* Add to VCL sub */
AN(p->method);
if (p->name == NULL) {
- (void)vcc_AddDef(tl, SYM_SUB);
(void)vcc_AddRef(tl, SYM_SUB);
p->name = tl->t;
}
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 17ac8c2..376e925 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -105,18 +105,34 @@ vcc_new_symbol(struct vcc *tl, const char *b, const char *e)
}
struct symbol *
-VCC_SymbolGet(struct vcc *tl, enum symkind kind, const char *err)
+VCC_SymbolGet(struct vcc *tl, enum symkind kind, const char *err,
+ enum xref_e xrf)
{
struct symbol *sym;
- sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind, 0);
- if (sym != NULL && sym->kind == kind)
- return (sym);
- VSB_printf(tl->sb, "%s: ", err);
- vcc_ErrToken(tl, tl->t);
- VSB_cat(tl->sb, "\nAt: ");
- vcc_ErrWhere(tl, tl->t);
- return (NULL);
+ sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind, err == NULL);
+ if (sym == NULL || sym->kind != kind) {
+ VSB_printf(tl->sb, "%s: ", err);
+ vcc_ErrToken(tl, tl->t);
+ VSB_cat(tl->sb, "\nAt: ");
+ vcc_ErrWhere(tl, tl->t);
+ return (NULL);
+ }
+ switch (xrf) {
+ case XREF_DEF:
+ if (sym->def_b == NULL)
+ sym->def_b = tl->t;
+ sym->ndef++;
+ break;
+ case XREF_REF:
+ if (sym->ref_b == NULL)
+ sym->ref_b = tl->t;
+ sym->nref++;
+ break;
+ default:
+ break;
+ }
+ return (sym);
}
struct symbol *
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index b4d307d..2b51c4f 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -270,6 +270,7 @@ vcc_ParseNew(struct vcc *tl)
{
struct symbol *sy1, *sy2, *sy3;
struct inifin *ifp;
+ struct token *t;
const char *p, *s_obj;
char buf1[128];
char buf2[128];
@@ -288,17 +289,18 @@ vcc_ParseNew(struct vcc *tl)
vcc_NextToken(tl);
ExpectErr(tl, ID);
- sy2 = VCC_SymbolGet(tl, SYM_OBJECT, "Symbol not found");
+ t = tl->t;
+ sy2 = VCC_SymbolGet(tl, SYM_OBJECT, "Symbol not found", XREF_NONE);
ERRCHK(tl);
+ vcc_NextToken(tl);
AN(sy2);
if (sy2->extra == NULL) {
VSB_printf(tl->sb, "Constructor not found: ");
- vcc_ErrToken(tl, tl->t);
+ vcc_ErrToken(tl, t);
VSB_printf(tl->sb, " at ");
- vcc_ErrWhere(tl, tl->t);
+ vcc_ErrWhere(tl, t);
return;
}
- vcc_NextToken(tl);
p = sy2->extra;
AN(p);
diff --git a/lib/libvcc/vcc_xref.c b/lib/libvcc/vcc_xref.c
index 9ad4d67..39031e8 100644
--- a/lib/libvcc/vcc_xref.c
+++ b/lib/libvcc/vcc_xref.c
@@ -76,19 +76,6 @@ vcc_AddRef(struct vcc *tl, enum symkind kind)
return (sym);
}
-struct symbol *
-vcc_AddDef(struct vcc *tl, enum symkind kind)
-{
- struct symbol *sym;
-
- sym = VCC_SymbolTok(tl, kind, 1);
- if (sym->def_b == NULL)
- sym->def_b = tl->t;
- AN(sym);
- sym->ndef++;
- return (sym);
-}
-
/*--------------------------------------------------------------------*/
static void
More information about the varnish-commit
mailing list