[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