[master] bd30219 More symbol table cleanup.

Poul-Henning Kamp phk at FreeBSD.org
Tue Jun 7 09:37:05 CEST 2016


commit bd30219ea12cb558ff156815d8d8c455dea5fe67
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Jun 7 07:36:01 2016 +0000

    More symbol table cleanup.

diff --git a/bin/varnishtest/tests/r01510.vtc b/bin/varnishtest/tests/r01510.vtc
index 9597240..a8eb7f7 100644
--- a/bin/varnishtest/tests/r01510.vtc
+++ b/bin/varnishtest/tests/r01510.vtc
@@ -1,6 +1,6 @@
 varnishtest "Duplicate object names"
 
-varnish v1 -errvcl {Object name 'first' already used.} {
+varnish v1 -errvcl {Instance 'first' redefined.} {
 	import debug;
 	sub vcl_init {
 		new first = debug.obj("FOO");
@@ -8,7 +8,7 @@ varnish v1 -errvcl {Object name 'first' already used.} {
 	}
 }
 
-varnish v1 -errvcl {Object name 'first' already used.} {
+varnish v1 -errvcl {Name 'first' already used.} {
 	import debug;
 
 	backend first { .host = "${bad_ip}"; .port = "9080"; }
diff --git a/bin/varnishtest/tests/r01569.vtc b/bin/varnishtest/tests/r01569.vtc
index af3c489..e3e2b1c 100644
--- a/bin/varnishtest/tests/r01569.vtc
+++ b/bin/varnishtest/tests/r01569.vtc
@@ -1,6 +1,6 @@
 varnishtest "symbol lookup order issue"
 
-varnish v1 -vcl {
+varnish v1 -errvcl {Name 'debug' already used.} {
 	vcl 4.0;
 	import debug;
 
diff --git a/bin/varnishtest/tests/v00034.vtc b/bin/varnishtest/tests/v00034.vtc
index 41626c1..b4d526f 100644
--- a/bin/varnishtest/tests/v00034.vtc
+++ b/bin/varnishtest/tests/v00034.vtc
@@ -7,19 +7,19 @@ server s1 {
 
 varnish v1 -vcl+backend { } -start
 
-varnish v1 -errvcl {Function c1 redefined} {
+varnish v1 -errvcl {Function 'c1' redefined} {
 	backend foo { .host = "127.0.0.1"; }
 	sub c1 { }
 	sub c1 { }
 	sub vcl_recv { call c1; }
 }
 
-varnish v1 -errvcl {Backend s1 redefined} {
+varnish v1 -errvcl {Backend 's1' redefined} {
 	backend s1 { .host = "127.0.0.1"; }
 	backend s1 { .host = "127.0.0.1"; }
 }
 
-varnish v1 -errvcl {Probe p1 redefined} {
+varnish v1 -errvcl {Probe 'p1' redefined} {
 	probe p1 { }
 	probe p1 { }
 	backend s1 { .host = "127.0.0.1"; .probe = p1;}
diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index 784578a..467f5d2 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -158,27 +158,12 @@ parse_new(struct vcc *tl)
 	ExpectErr(tl, ID);
 	vcc_ExpectCid(tl, "VCL object");
 	ERRCHK(tl);
-	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));
-
-		if (sy1->def_b) {
-			VSB_printf(tl->sb, "First usage:\n");
-			AN(sy1->def_b);
-			if (sy1->def_e != NULL)
-				vcc_ErrWhere2(tl, sy1->def_b, sy1->def_e);
-			else
-				vcc_ErrWhere(tl, sy1->def_b);
-			VSB_printf(tl->sb, "Redefinition:\n");
-			vcc_ErrWhere(tl, tl->t);
-		}
-		return;
-	}
+	sy1 = VCC_HandleSymbol(tl, tl->t, INSTANCE, "XXX");
+	ERRCHK(tl);
+
+	/* We allow implicit use of VMOD objects:  Pretend it's ref'ed */
+	sy1->nref++;
 
-	sy1 = VCC_SymbolTok(tl, NULL, tl->t, SYM_INSTANCE, 1);
-	XXXAN(sy1);
-	sy1->def_b = tl->t;
 	vcc_NextToken(tl);
 
 	ExpectErr(tl, '=');
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 1e11540..8653b30 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -905,11 +905,13 @@ void
 VCP_Stevedore(struct vcp *vcp, const char *stv_name)
 {
 	struct symbol *sym;
+	char stv[1024];
 
 	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
 	ALLOC_OBJ(sym, SYMBOL_MAGIC);
 	AN(sym);
-	REPLACE(sym->name, stv_name);		/* XXX storage.* ? */
+	bprintf(stv, "stv.%s", stv_name);
+	REPLACE(sym->name, stv);		/* XXX storage.* ? */
 	sym->kind = SYM_STEVEDORE;
 	VCC_GlobalSymbol(sym, STEVEDORE, "VRT_stevedore(\"%s\")", stv_name);
 	VTAILQ_INSERT_TAIL(&vcp->symbols, sym, list);
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index e6df4c8..bcb9586 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -240,7 +240,7 @@ vcc_ParseFunction(struct vcc *tl)
 		i = vcc_AddDef(tl, tl->t, SYM_SUB);
 		if (i > 1) {
 			VSB_printf(tl->sb,
-			    "Function %.*s redefined\n", PF(tl->t));
+			    "Function '%.*s' redefined\n", PF(tl->t));
 			vcc_ErrWhere(tl, tl->t);
 			return;
 		}
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 79c6798..4b9979d 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -42,11 +42,12 @@ enum symkind
 VCC_HandleKind(enum var_type fmt)
 {
 	switch(fmt) {
-	case ACL:       return(SYM_ACL);
-	case BACKEND:   return(SYM_BACKEND);
-	case PROBE:     return(SYM_PROBE);
-	case STEVEDORE: return(SYM_STEVEDORE);
-	default:        return(SYM_NONE);
+	case ACL:	return(SYM_ACL);
+	case BACKEND:	return(SYM_BACKEND);
+	case PROBE:	return(SYM_PROBE);
+	case STEVEDORE:	return(SYM_STEVEDORE);
+	case INSTANCE:	return(SYM_INSTANCE);
+	default:	return(SYM_NONE);
 	}
 }
 
@@ -223,26 +224,43 @@ VCC_HandleSymbol(struct vcc *tl, const struct token *tk, enum var_type fmt,
 {
 	struct symbol *sym;
 	enum symkind kind;
-	va_list ap;
 	const char *p;
+	va_list ap;
 
 	kind = VCC_HandleKind(fmt);
 	assert(kind != SYM_NONE);
 
-	sym = VCC_SymbolTok(tl, NULL, tk, kind, 1);
-	if (sym->def_b == NULL)
-		sym->def_b = tk;
-	AN(sym);
-	if (sym->ndef > 0) {
+	sym = VCC_SymbolTok(tl, NULL, tk, SYM_NONE, 0);
+	if (sym != NULL && sym->def_b != NULL && kind == sym->kind) {
 		p = VCC_SymKind(tl, sym);
-		VSB_printf(tl->sb, "%c%s %.*s redefined\n",
-		    toupper(*p), p+1, PF(tk));
+		VSB_printf(tl->sb, "%c%s '%.*s' redefined.\n",
+		    toupper(*p), p + 1, PF(tk));
+		vcc_ErrWhere(tl, tk);
+		VSB_printf(tl->sb, "First definition:\n");
+		AN(sym->def_b);
+		vcc_ErrWhere(tl, sym->def_b);
+		return (sym);
+	} else if (sym != NULL && sym->def_b != NULL) {
+		VSB_printf(tl->sb, "Name '%.*s' already used.\n", PF(tk));
+		vcc_ErrWhere(tl, tk);
+		VSB_printf(tl->sb, "First definition:\n");
+		AN(sym->def_b);
+		vcc_ErrWhere(tl, sym->def_b);
+		return (sym);
+	} else if (sym != NULL) {
+		VSB_printf(tl->sb,
+		    "Name %.*s is a reserved name.\n", PF(tk));
 		vcc_ErrWhere(tl, tk);
 		return (sym);
 	}
+	sym = VCC_SymbolTok(tl, NULL, tk, kind, 1);
+	AN(sym);
+	AZ(sym->ndef);
 	va_start(ap, str);
 	vcc_global(tl, sym, fmt, str, ap);
 	va_end(ap);
 	sym->ndef = 1;
+	if (sym->def_b == NULL)
+		sym->def_b = tk;
 	return (sym);
 }



More information about the varnish-commit mailing list