[master] 9bb435c Start implementing vcl 4.1.

Poul-Henning Kamp phk at FreeBSD.org
Mon Feb 5 10:26:14 UTC 2018


commit 9bb435c4dae447ab9469af8a034bb335d323cdaf
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Feb 5 10:12:53 2018 +0000

    Start implementing vcl 4.1.
    
    In vcl 4.1 symbol names are unique across all types & kinds.

diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 81f4135..093e2b1 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -967,6 +967,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, SYMTAB_CREATE, XREF_REF);
+	ERRCHK(tl);
 	AN(sym);
 	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 e11a16b..e3e69cb 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -365,7 +365,7 @@ vcc_Parse(struct vcc *tl)
 	}
 	tok = tl->t;
 	vcc_ParseVcl(tl);
-	if (tok->src->syntax != 4.0) {
+	if (tok->src->syntax < 40 || tok->src->syntax > 41) {
 		VSB_printf(tl->sb, "VCL version %.1f not supported.\n",
 		    .1 * tok->src->syntax);
 		vcc_ErrWhere2(tl, tok, tl->t);
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 3ba2b8c..d2cd1bc 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -146,8 +146,9 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent,
 			continue;
 		if (q < e)
 			break;
-		if ((kind == SYM_NONE && kind == sym->kind) ||
-		    (kind != SYM_NONE && kind != sym->kind))
+		if ((kind == SYM_NONE && kind == sym->kind))
+			continue;
+		if (tl->syntax < 41 && (kind != SYM_NONE && kind != sym->kind))
 			continue;
 		break;
 	}
@@ -203,13 +204,31 @@ VCC_SymbolGet(struct vcc *tl, enum symkind kind, const char *e, const char *x)
 	    e == SYMTAB_CREATE ? 1 : 0);
 	if (sym == NULL && e == SYMTAB_NOERR)
 		return (sym);
-	if (sym == NULL || (kind != SYM_NONE && sym->kind != kind)) {
+	if (sym == NULL) {
 		VSB_printf(tl->sb, "%s: ", e);
 		vcc_ErrToken(tl, tl->t);
 		VSB_cat(tl->sb, "\nAt: ");
 		vcc_ErrWhere(tl, tl->t);
 		return (NULL);
 	}
+	if (kind != SYM_NONE && kind != sym->kind) {
+		VSB_printf(tl->sb, "Symbol ");
+		vcc_ErrToken(tl, tl->t);
+		VSB_printf(tl->sb, " has wrong type (%s): ",
+			VCC_SymKind(tl, sym));
+		VSB_cat(tl->sb, "\nAt: ");
+		vcc_ErrWhere(tl, tl->t);
+		if (sym->def_b != NULL) {
+			VSB_printf(tl->sb, "Symbol was defined here: ");
+			vcc_ErrWhere(tl, sym->def_b);
+		} else if (sym->ref_b != NULL) {
+			VSB_printf(tl->sb, "Symbol was declared here: ");
+			vcc_ErrWhere(tl, sym->ref_b);
+		} else {
+			VSB_printf(tl->sb, "Symbol was builtin\n");
+		}
+		return (NULL);
+	}
 	if (x == XREF_DEF) {
 		if (sym->def_b == NULL)
 			sym->def_b = tl->t;
@@ -325,6 +344,8 @@ VCC_HandleSymbol(struct vcc *tl, vcc_type_t fmt, const char *pfx)
 	}
 	if (sym == NULL)
 		sym = VCC_SymbolGet(tl, kind, SYMTAB_CREATE, XREF_NONE);
+	if (sym == NULL)
+		return (NULL);
 	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 32cd611..02789c5 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -281,6 +281,7 @@ vcc_Act_New(struct vcc *tl, struct token *t, struct symbol *sym)
 	ERRCHK(tl);
 	sy1 = VCC_HandleSymbol(tl, INSTANCE, "vo");
 	ERRCHK(tl);
+	AN(sy1);
 	sy1->noref = 1;
 
 	ExpectErr(tl, '=');


More information about the varnish-commit mailing list