[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