[master] 94d0acd Never emit C symbols using VCL tokens

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Mon Aug 14 11:02:06 CEST 2017


commit 94d0acd337b0bfa62a4926076c72ec7da100fbc1
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Thu Jun 22 17:54:48 2017 +0200

    Never emit C symbols using VCL tokens
    
    There's already an impedence mismatch between both languages and it's
    going to increase soon.
    
    Refs #2325

diff --git a/lib/libvcc/generate.py b/lib/libvcc/generate.py
index 13645ea..ed31ae9 100755
--- a/lib/libvcc/generate.py
+++ b/lib/libvcc/generate.py
@@ -827,6 +827,7 @@ stv_variables = (
 
 vcltypes = {
 	'STRING_LIST':	"void*",
+	'SUB':			"void*",
 }
 
 fi = open(join(srcroot, "include/vrt.h"))
diff --git a/lib/libvcc/vcc_acl.c b/lib/libvcc/vcc_acl.c
index 2a733d2..b97ad2c 100644
--- a/lib/libvcc/vcc_acl.c
+++ b/lib/libvcc/vcc_acl.c
@@ -353,7 +353,7 @@ vcc_acl_emit(struct vcc *tl, const char *acln, int anon)
 	Fh(tl, 0, "\nstatic int __match_proto__(acl_match_f)\n");
 	Fh(tl, 0,
 	    "match_acl_%s_%s(VRT_CTX, const VCL_IP p)\n",
-	    anon ? "anon" : "named", acln);
+	    anon ? "anon" : "named", acln); /* XXX: acln isn't an rname */
 	Fh(tl, 0, "{\n");
 	Fh(tl, 0, "\tconst unsigned char *a;\n");
 	Fh(tl, 0, "\tint fam;\n");
@@ -447,10 +447,10 @@ vcc_acl_emit(struct vcc *tl, const char *acln, int anon)
 		return;
 
 	/* Emit the struct that will be referenced */
-	Fh(tl, 0, "\nconst struct vrt_acl vrt_acl_named_%s = {\n", acln);
+	Fh(tl, 0, "\nconst struct vrt_acl vrt_acl_named_%s[] = {{\n", acln);
 	Fh(tl, 0, "\t.magic = VRT_ACL_MAGIC,\n");
 	Fh(tl, 0, "\t.match = &match_acl_named_%s,\n", acln);
-	Fh(tl, 0, "};\n\n");
+	Fh(tl, 0, "}};\n\n");
 }
 
 void
@@ -473,7 +473,7 @@ void
 vcc_ParseAcl(struct vcc *tl)
 {
 	struct token *an;
-	char *acln;
+	struct symbol *sym;
 
 	vcc_NextToken(tl);
 	VTAILQ_INIT(&tl->acl);
@@ -483,10 +483,9 @@ vcc_ParseAcl(struct vcc *tl)
 	an = tl->t;
 	vcc_NextToken(tl);
 
-	acln = TlDupTok(tl, an);
-
-	(void)VCC_HandleSymbol(tl, an, ACL, ACL_SYMBOL_PREFIX);
+	sym = VCC_HandleSymbol(tl, an, ACL, ACL_SYMBOL_PREFIX);
 	ERRCHK(tl);
+	AN(sym);
 
 	SkipToken(tl, '{');
 
@@ -497,5 +496,5 @@ vcc_ParseAcl(struct vcc *tl)
 	}
 	SkipToken(tl, '}');
 
-	vcc_acl_emit(tl, acln, 0);
+	vcc_acl_emit(tl, sym->name, 0);
 }
diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index 17293f5..2c9b046 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -42,12 +42,14 @@
 static void
 parse_call(struct vcc *tl)
 {
+	struct symbol *sym;
 
 	vcc_NextToken(tl);
 	ExpectErr(tl, ID);
 	vcc_AddCall(tl, tl->t);
-	(void)vcc_AddRef(tl, tl->t, SYM_SUB);
-	Fb(tl, 1, "VGC_function_%.*s(ctx);\n", PF(tl->t));
+	sym = vcc_AddRef(tl, tl->t, SYM_SUB);
+	VCC_GlobalSymbol(sym, SUB, "VGC_function");
+	Fb(tl, 1, "%s(ctx);\n", sym->rname);
 	vcc_NextToken(tl);
 }
 
@@ -251,25 +253,25 @@ parse_return_vcl(struct vcc *tl)
 		return;
 	}
 	if (sym->eval_priv == NULL) {
-		VSB_printf(tl->fi, "%s VCL %.*s */\n",
-		    VCC_INFO_PREFIX, PF(tl->t));
+		VSB_printf(tl->fi, "%s VCL %s */\n", VCC_INFO_PREFIX,
+		    sym->name);
 
 		bprintf(buf, "vgc_vcl_%u", tl->unique++);
 		sym->eval_priv = strdup(buf);
 		AN(sym->eval_priv);
 
 		Fh(tl, 0, "static VCL_VCL %s;", buf);
-		Fh(tl, 0, "\t/* VCL %.*s */\n", PF(tl->t));
+		Fh(tl, 0, "\t/* VCL %s */\n", sym->name);
 
 		p = New_IniFin(tl);
 		AN(p);
-		VSB_printf(p->ini, "\t%s = VRT_vcl_get(ctx, \"%.*s\");",
-		    buf, PF(tl->t));
+		VSB_printf(p->ini, "\t%s = VRT_vcl_get(ctx, \"%s\");",
+		    buf, sym->name);
 		VSB_printf(p->fin, "\tVRT_vcl_rel(ctx, %s);",
 		    buf);
 	}
-	Fb(tl, 1, "VRT_vcl_select(ctx, %s);\t/* %.*s */\n",
-	    (const char*)sym->eval_priv, PF(tl->t));
+	Fb(tl, 1, "VRT_vcl_select(ctx, %s);\t/* %s */\n",
+	    (const char*)sym->eval_priv, sym->name);
 	vcc_NextToken(tl);
 	ExpectErr(tl, ')');
 	vcc_NextToken(tl);
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index 6c9a178..5775ee2 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -91,7 +91,7 @@ vcc_ProbeRedef(struct vcc *tl, struct token **t_did,
 }
 
 static void
-vcc_ParseProbeSpec(struct vcc *tl, const struct token *nm, char **name)
+vcc_ParseProbeSpec(struct vcc *tl, const struct symbol *sym, char **name)
 {
 	struct fld_spec *fs;
 	struct token *t_field;
@@ -117,12 +117,13 @@ vcc_ParseProbeSpec(struct vcc *tl, const struct token *nm, char **name)
 
 	vsb = VSB_new_auto();
 	AN(vsb);
-	if (nm != NULL)
-		VSB_printf(vsb, "vgc_probe_%.*s", PF(nm));
+	if (sym != NULL)
+		VSB_cat(vsb, sym->rname);
 	else
 		VSB_printf(vsb, "vgc_probe__%d", tl->nprobe++);
 	AZ(VSB_finish(vsb));
 	retval = TlDup(tl, VSB_data(vsb));
+	AN(retval);
 	VSB_destroy(&vsb);
 	if (name != NULL)
 		*name = retval;
@@ -131,7 +132,7 @@ vcc_ParseProbeSpec(struct vcc *tl, const struct token *nm, char **name)
 	threshold = 0;
 	initial = 0;
 	status = 0;
-	Fh(tl, 0, "static const struct vrt_backend_probe %s = {\n", retval);
+	Fh(tl, 0, "static const struct vrt_backend_probe %s[] = {{\n", retval);
 	Fh(tl, 0, "\t.magic = VRT_BACKEND_PROBE_MAGIC,\n");
 	while (tl->t->tok != '}') {
 
@@ -237,7 +238,7 @@ vcc_ParseProbeSpec(struct vcc *tl, const struct token *nm, char **name)
 		Fh(tl, 0, "\t.initial = ~0U,\n");
 	if (status > 0)
 		Fh(tl, 0, "\t.exp_status = %u,\n", status);
-	Fh(tl, 0, "};\n");
+	Fh(tl, 0, "}};\n");
 	SkipToken(tl, '}');
 }
 
@@ -249,6 +250,7 @@ void
 vcc_ParseProbe(struct vcc *tl)
 {
 	struct token *t_probe;
+	struct symbol *sym;
 	char *p;
 
 	vcc_NextToken(tl);			/* ID: probe */
@@ -258,10 +260,11 @@ vcc_ParseProbe(struct vcc *tl)
 	t_probe = tl->t;
 	vcc_NextToken(tl);
 
-	(void)VCC_HandleSymbol(tl, t_probe, PROBE, "&vgc_probe");
+	sym = VCC_HandleSymbol(tl, t_probe, PROBE, "vgc_probe");
 	ERRCHK(tl);
+	AN(sym);
 
-	vcc_ParseProbeSpec(tl, t_probe, &p);
+	vcc_ParseProbeSpec(tl, sym, &p);
 	if (vcc_IdIs(t_probe, "default")) {
 		(void)vcc_AddRef(tl, t_probe, SYM_PROBE);
 		tl->default_probe = p;
@@ -282,6 +285,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 	struct token *t_host = NULL;
 	struct token *t_port = NULL;
 	struct token *t_hosthdr = NULL;
+	struct symbol *pb;
 	struct fld_spec *fs;
 	struct inifin *ifp;
 	struct vsb *vsb;
@@ -385,16 +389,17 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 			Fb(tl, 0, "\t.proxy_header = %u,\n", u);
 		} else if (vcc_IdIs(t_field, "probe") && tl->t->tok == '{') {
 			vcc_ParseProbeSpec(tl, NULL, &p);
-			Fb(tl, 0, "\t.probe = &%s,\n", p);
+			Fb(tl, 0, "\t.probe = %s,\n", p);
 			ERRCHK(tl);
 		} else if (vcc_IdIs(t_field, "probe") && tl->t->tok == ID) {
-			if (!VCC_SymbolTok(tl, NULL, tl->t, SYM_PROBE, 0)) {
+			pb = VCC_SymbolTok(tl, NULL, tl->t, SYM_PROBE, 0);
+			if (pb == NULL) {
 				VSB_printf(tl->sb, "Probe %.*s not found\n",
 				    PF(tl->t));
 				vcc_ErrWhere(tl, tl->t);
 				return;
 			}
-			Fb(tl, 0, "\t.probe = &vgc_probe_%.*s,\n", PF(tl->t));
+			Fb(tl, 0, "\t.probe = %s,\n", pb->rname);
 			(void)vcc_AddRef(tl, tl->t, SYM_PROBE);
 			vcc_NextToken(tl);
 			SkipToken(tl, ';');
@@ -457,7 +462,6 @@ vcc_ParseBackend(struct vcc *tl)
 {
 	struct token *t_first, *t_be;
 	struct symbol *sym;
-	char vgcname[MAX_BACKEND_NAME + 20];
 
 	t_first = tl->t;
 	vcc_NextToken(tl);		/* ID: backend */
@@ -465,6 +469,7 @@ vcc_ParseBackend(struct vcc *tl)
 	vcc_ExpectCid(tl, "backend");	/* ID: name */
 	ERRCHK(tl);
 
+	/* XXX: lift this limit once VSM ident becomes dynamic */
 	if (tl->t->e - tl->t->b > MAX_BACKEND_NAME) {
 		VSB_printf(tl->sb,
 		    "Name of %.*s too long (max %d, is %zu):\n",
@@ -477,13 +482,12 @@ vcc_ParseBackend(struct vcc *tl)
 	t_be = tl->t;
 	vcc_NextToken(tl);
 
-	bprintf(vgcname, "vgc_backend_%.*s", PF(t_be));
-	Fh(tl, 0, "\nstatic struct director *%s;\n", vgcname);
-
 	sym = VCC_HandleSymbol(tl, t_be, BACKEND, "vgc_backend");
 	ERRCHK(tl);
 
-	vcc_ParseHostDef(tl, t_be, vgcname);
+	Fh(tl, 0, "\nstatic struct director *%s;\n", sym->rname);
+
+	vcc_ParseHostDef(tl, t_be, sym->rname);
 	ERRCHK(tl);
 
 	if (tl->err) {
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index f6660fd..290aa8e 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -411,7 +411,7 @@ EmitStruct(const struct vcc *tl)
 	Fc(tl, 0, "\t.event_vcl = VGC_Event,\n");
 	Fc(tl, 0, "\t.default_director = &%s,\n", tl->default_director);
 	if (tl->default_probe != NULL)
-		Fc(tl, 0, "\t.default_probe = &%s,\n", tl->default_probe);
+		Fc(tl, 0, "\t.default_probe = %s,\n", tl->default_probe);
 	Fc(tl, 0, "\t.ref = VGC_ref,\n");
 	Fc(tl, 0, "\t.nref = VGC_NREFS,\n");
 	Fc(tl, 0, "\t.nsrc = VGC_NSRCS,\n");
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 0a05d21..6859df2 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -361,4 +361,4 @@ int vcc_CheckUses(struct vcc *tl);
 #define SkipToken(a, b) \
     do { vcc__Expect(a, b, __LINE__); ERRCHK(a); vcc_NextToken(a); } while (0)
 
-#define ACL_SYMBOL_PREFIX "&vrt_acl_named"
+#define ACL_SYMBOL_PREFIX "vrt_acl_named"
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index abc58b2..1e144b4 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -240,17 +240,17 @@ vcc_ParseFunction(struct vcc *tl)
 	} else {
 		tl->fb = tl->fc;
 		sym = vcc_AddDef(tl, tl->t, SYM_SUB);
+		VCC_GlobalSymbol(sym, SUB, "VGC_function");
 		if (sym->ndef > 1) {
 			VSB_printf(tl->sb,
-			    "Function '%.*s' redefined\n", PF(tl->t));
+			    "Function '%s' redefined\n", sym->name);
 			vcc_ErrWhere(tl, tl->t);
 			return;
 		}
 		tl->curproc = vcc_AddProc(tl, tl->t);
-		Fh(tl, 0, "void VGC_function_%.*s(VRT_CTX);\n", PF(tl->t));
+		Fh(tl, 0, "void %s(VRT_CTX);\n", sym->rname);
 		Fc(tl, 1, "\nvoid __match_proto__(vcl_func_t)\n");
-		Fc(tl, 1, "VGC_function_%.*s(VRT_CTX)\n",
-		    PF(tl->t));
+		Fc(tl, 1, "%s(VRT_CTX)\n", sym->rname);
 	}
 	vcc_NextToken(tl);
 	tl->indent += INDENT;
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 045a239..8fc56dc 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -45,6 +45,7 @@ VCC_HandleKind(vcc_type_t fmt)
 	if (fmt == BACKEND)	return(SYM_BACKEND);
 	if (fmt == PROBE)	return(SYM_PROBE);
 	if (fmt == STEVEDORE)	return(SYM_STEVEDORE);
+	if (fmt == SUB)		return(SYM_SUB);
 	if (fmt == INSTANCE)	return(SYM_INSTANCE);
 	return(SYM_NONE);
 }
diff --git a/lib/libvcc/vcc_types.c b/lib/libvcc/vcc_types.c
index af41455..00a2198 100644
--- a/lib/libvcc/vcc_types.c
+++ b/lib/libvcc/vcc_types.c
@@ -140,6 +140,11 @@ const struct type STRING_LIST[1] = {{
 	.tostring =		"VRT_CollectString(ctx,\n\v1,\nvrt_magic_string_end)",
 }};
 
+const struct type SUB[1] = {{
+	.magic =		TYPE_MAGIC,
+	.name =			"SUB",
+}};
+
 const struct type TIME[1] = {{
 	.magic =		TYPE_MAGIC,
 	.name =			"TIME",



More information about the varnish-commit mailing list