[master] 03ca454 Moving parsing of "new" to vcc_vmod.c where it belongs.
Poul-Henning Kamp
phk at FreeBSD.org
Wed Jun 8 20:59:06 CEST 2016
commit 03ca4548b8608c3cb5d0e50a66e6289343398ce8
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Jun 8 16:18:13 2016 +0000
Moving parsing of "new" to vcc_vmod.c where it belongs.
Minor simplifications.
diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index 67daa80..37482f0 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -146,96 +146,6 @@ parse_unset(struct vcc *tl)
/*--------------------------------------------------------------------*/
static void
-parse_new(struct vcc *tl)
-{
- struct symbol *sy1, *sy2, *sy3;
- struct inifin *ifp;
- const char *p, *s_obj, *s_init, *s_struct, *s_fini;
- char buf1[128];
- char buf2[128];
-
- vcc_NextToken(tl);
- ExpectErr(tl, ID);
- vcc_ExpectCid(tl, "VCL object");
- ERRCHK(tl);
- sy1 = VCC_HandleSymbol(tl, tl->t, INSTANCE, "XXX");
- ERRCHK(tl);
-
- /* We allow implicit use of VMOD objects: Pretend it's ref'ed */
- sy1->nref++;
-
- vcc_NextToken(tl);
-
- ExpectErr(tl, '=');
- vcc_NextToken(tl);
-
- ExpectErr(tl, ID);
- sy2 = VCC_SymbolTok(tl, NULL, tl->t, SYM_OBJECT, 0);
- if (sy2 == NULL) {
- VSB_printf(tl->sb, "Symbol not found: ");
- vcc_ErrToken(tl, tl->t);
- VSB_printf(tl->sb, " at ");
- vcc_ErrWhere(tl, tl->t);
- return;
- }
- XXXAN(sy2);
-
- /*lint -save -e448 */
- /* Split the first three args */
- p = sy2->args;
-
- s_obj = p;
- p += strlen(p) + 1;
-
- s_struct = p;
- p += strlen(p) + 1;
-
- s_init = p;
- while (p[0] != '\0' || p[1] != '\0' || p[2] != '\0')
- p++;
- p += 3;
-
- s_fini = p;
- while (p[0] != '\0' || p[1] != '\0' || p[2] != '\0')
- p++;
- p += 3;
-
- Fh(tl, 0, "static %s *vo_%s;\n\n", s_struct, sy1->name);
-
- vcc_NextToken(tl);
-
- bprintf(buf1, ", &vo_%s, \"%s\"", sy1->name, sy1->name);
- vcc_Eval_Func(tl, s_init, buf1, sy2->name, s_init + strlen(s_init) + 1,
- sy2->vmod);
- ifp = New_IniFin(tl);
- VSB_printf(ifp->fin, "\t\t%s(&vo_%s);", s_fini, sy1->name);
- ExpectErr(tl, ';');
-
- bprintf(buf1, ", vo_%s", sy1->name);
- /* Split the methods from the args */
- while (*p != '\0') {
- p += strlen(s_obj);
- bprintf(buf2, "%s%s", sy1->name, p);
- sy3 = VCC_Symbol(tl, NULL, buf2, NULL, SYM_FUNC, 1);
- AN(sy3);
- sy3->eval = vcc_Eval_SymFunc;
- p += strlen(p) + 1;
- sy3->cfunc = p;
- p += strlen(p) + 1;
-
- sy3->args = p;
- sy3->extra = TlDup(tl, buf1);
- while (p[0] != '\0' || p[1] != '\0' || p[2] != '\0')
- p++;
- p += 3;
- }
- sy1->def_e = tl->t;
- /*lint -restore */
-}
-
-/*--------------------------------------------------------------------*/
-
-static void
parse_ban(struct vcc *tl)
{
@@ -375,7 +285,7 @@ static struct action_table {
{ "ban", parse_ban },
{ "call", parse_call },
{ "hash_data", parse_hash_data, VCL_MET_HASH },
- { "new", parse_new, VCL_MET_INIT},
+ { "new", vcc_ParseNew, VCL_MET_INIT},
{ "return", parse_return },
{ "set", parse_set },
{ "synthetic", parse_synthetic,
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 99dfcfb..84ec643 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -133,7 +133,7 @@ struct symbol {
vcc_type_t fmt;
sym_expr_t *eval;
- void *eval_priv;
+ const void *eval_priv;
/* xref.c */
struct proc *proc;
@@ -342,6 +342,7 @@ const struct symbol *vcc_FindVar(struct vcc *tl, const struct token *t,
/* vcc_vmod.c */
void vcc_ParseImport(struct vcc *tl);
+void vcc_ParseNew(struct vcc *tl);
/* vcc_xref.c */
int vcc_AddDef(struct vcc *tl, const struct token *t, enum symkind type);
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 1a73ce3..ff30a74 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -727,16 +727,23 @@ void __match_proto__(sym_expr_t)
vcc_Eval_SymFunc(struct vcc *tl, struct expr **e, const struct symbol *sym,
vcc_type_t fmt)
{
+ const char *cfunc;
+ const char *args;
+ const char *p;
(void)fmt;
assert(sym->kind == SYM_FUNC);
/* XXX */
- AN(sym->cfunc);
+ AN(sym->eval_priv);
+ AZ(sym->args);
+ AZ(sym->cfunc);
+ p = sym->eval_priv;
+ cfunc = p;
+ p += strlen(p) + 1;
+ args = p;
AN(sym->name);
- AN(sym->args);
SkipToken(tl, ID);
- vcc_func(tl, e, sym->cfunc, sym->extra, sym->name, sym->args,
- sym->vmod);
+ vcc_func(tl, e, cfunc, sym->extra, sym->name, args, sym->vmod);
}
/*--------------------------------------------------------------------
@@ -778,10 +785,6 @@ vcc_expr4(struct vcc *tl, struct expr **e, vcc_type_t fmt)
if (kind != SYM_NONE)
sym = VCC_SymbolTok(tl, NULL, tl->t, kind, 0);
if (sym == NULL)
- sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_VAR, 0);
- if (sym == NULL)
- sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_FUNC, 0);
- if (sym == NULL)
sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_NONE, 0);
if (sym == NULL || sym->eval == NULL) {
VSB_printf(tl->sb, "Symbol not found: ");
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index c151337..2e6f128 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -245,9 +245,8 @@ vcc_ParseImport(struct vcc *tl)
sym->vmod = msym->name;
sym->eval = vcc_Eval_SymFunc;
p += strlen(p) + 1;
- sym->cfunc = p;
+ sym->eval_priv = p;
p += strlen(p) + 1;
- sym->args = p;
sym->fmt = VCC_Type(p);
AN(sym->fmt);
p += strlen(p) + 1;
@@ -264,3 +263,90 @@ vcc_ParseImport(struct vcc *tl)
Fh(tl, 0, "\n%s\n", vmd->proto);
Fh(tl, 0, "\n/* --- END VMOD %.*s --- */\n\n", PF(mod));
}
+
+void
+vcc_ParseNew(struct vcc *tl)
+{
+ struct symbol *sy1, *sy2, *sy3;
+ struct inifin *ifp;
+ const char *p, *s_obj, *s_init, *s_struct, *s_fini;
+ char buf1[128];
+ char buf2[128];
+
+ vcc_NextToken(tl);
+ ExpectErr(tl, ID);
+ vcc_ExpectCid(tl, "VCL object");
+ ERRCHK(tl);
+ sy1 = VCC_HandleSymbol(tl, tl->t, INSTANCE, "XXX");
+ ERRCHK(tl);
+
+ /* We allow implicit use of VMOD objects: Pretend it's ref'ed */
+ sy1->nref++;
+
+ vcc_NextToken(tl);
+
+ ExpectErr(tl, '=');
+ vcc_NextToken(tl);
+
+ ExpectErr(tl, ID);
+ sy2 = VCC_SymbolTok(tl, NULL, tl->t, SYM_OBJECT, 0);
+ if (sy2 == NULL) {
+ VSB_printf(tl->sb, "Symbol not found: ");
+ vcc_ErrToken(tl, tl->t);
+ VSB_printf(tl->sb, " at ");
+ vcc_ErrWhere(tl, tl->t);
+ return;
+ }
+ XXXAN(sy2);
+
+ /*lint -save -e448 */
+ /* Split the first three args */
+ p = sy2->args;
+
+ s_obj = p;
+ p += strlen(p) + 1;
+
+ s_struct = p;
+ p += strlen(p) + 1;
+
+ s_init = p;
+ while (p[0] != '\0' || p[1] != '\0' || p[2] != '\0')
+ p++;
+ p += 3;
+
+ s_fini = p;
+ while (p[0] != '\0' || p[1] != '\0' || p[2] != '\0')
+ p++;
+ p += 3;
+
+ Fh(tl, 0, "static %s *vo_%s;\n\n", s_struct, sy1->name);
+
+ vcc_NextToken(tl);
+
+ bprintf(buf1, ", &vo_%s, \"%s\"", sy1->name, sy1->name);
+ vcc_Eval_Func(tl, s_init, buf1, sy2->name, s_init + strlen(s_init) + 1,
+ sy2->vmod);
+ ifp = New_IniFin(tl);
+ VSB_printf(ifp->fin, "\t\t%s(&vo_%s);", s_fini, sy1->name);
+ ExpectErr(tl, ';');
+
+ bprintf(buf1, ", vo_%s", sy1->name);
+ /* Split the methods from the args */
+ while (*p != '\0') {
+ p += strlen(s_obj);
+ bprintf(buf2, "%s%s", sy1->name, p);
+ sy3 = VCC_Symbol(tl, NULL, buf2, NULL, SYM_FUNC, 1);
+ AN(sy3);
+ sy3->eval = vcc_Eval_SymFunc;
+ p += strlen(p) + 1;
+ sy3->eval_priv = p;
+ p += strlen(p) + 1;
+ sy3->fmt = VCC_Type(p);
+ sy3->extra = TlDup(tl, buf1);
+ while (p[0] != '\0' || p[1] != '\0' || p[2] != '\0')
+ p++;
+ p += 3;
+ }
+ sy1->def_e = tl->t;
+ /*lint -restore */
+}
More information about the varnish-commit
mailing list