[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