[master] 1a5ca1e Dispatch function calls through sym->action

Poul-Henning Kamp phk at FreeBSD.org
Wed Jan 31 10:50:10 UTC 2018


commit 1a5ca1ef9c82e5e44f9c9013416831fa7440303f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Jan 31 08:37:53 2018 +0000

    Dispatch function calls through sym->action

diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index 9c77516..61d4264 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -39,10 +39,9 @@
 
 /*--------------------------------------------------------------------*/
 
-static void
-parse_call(struct vcc *tl)
+static void v_matchproto_(sym_act_f)
+parse_call(struct vcc *tl, struct symbol *sym)
 {
-	struct symbol *sym;
 
 	vcc_NextToken(tl);
 	ExpectErr(tl, ID);
@@ -86,10 +85,9 @@ static const struct arith {
 
 /*--------------------------------------------------------------------*/
 
-static void
-parse_set(struct vcc *tl)
+static void v_matchproto_(sym_act_f)
+parse_set(struct vcc *tl, struct symbol *sym)
 {
-	const struct symbol *sym;
 	const struct arith *ap;
 	const struct token *t;
 	vcc_type_t fmt;
@@ -143,10 +141,9 @@ parse_set(struct vcc *tl)
 
 /*--------------------------------------------------------------------*/
 
-static void
-parse_unset(struct vcc *tl)
+static void v_matchproto_(sym_act_f)
+parse_unset(struct vcc *tl, struct symbol *sym)
 {
-	const struct symbol *sym;
 	const struct token *t;
 
 	/* XXX: Wrong, should use VCC_Expr(HEADER) */
@@ -169,10 +166,11 @@ parse_unset(struct vcc *tl)
 
 /*--------------------------------------------------------------------*/
 
-static void
-parse_ban(struct vcc *tl)
+static void v_matchproto_(sym_act_f)
+parse_ban(struct vcc *tl, struct symbol *sym)
 {
 
+	(void)sym;
 	vcc_NextToken(tl);
 
 	ExpectErr(tl, '(');
@@ -191,9 +189,11 @@ parse_ban(struct vcc *tl)
 
 /*--------------------------------------------------------------------*/
 
-static void
-parse_hash_data(struct vcc *tl)
+static void v_matchproto_(sym_act_f)
+parse_hash_data(struct vcc *tl, struct symbol *sym)
 {
+
+	(void)sym;
 	vcc_NextToken(tl);
 	SkipToken(tl, '(');
 
@@ -287,12 +287,13 @@ parse_return_vcl(struct vcc *tl)
 
 /*--------------------------------------------------------------------*/
 
-static void
-parse_return(struct vcc *tl)
+static void v_matchproto_(sym_act_f)
+parse_return(struct vcc *tl, struct symbol *sym)
 {
 	unsigned hand;
 	const char *h;
 
+	(void)sym;
 	vcc_NextToken(tl);
 	AN(tl->curproc);
 	if (tl->t->tok == ';' && tl->curproc->method == NULL) {
@@ -345,11 +346,12 @@ parse_return(struct vcc *tl)
 
 /*--------------------------------------------------------------------*/
 
-static void
-parse_synthetic(struct vcc *tl)
+static void v_matchproto_(sym_act_f)
+parse_synthetic(struct vcc *tl, struct symbol *sym)
 {
 	vcc_NextToken(tl);
 
+	(void)sym;
 	ExpectErr(tl, '(');
 	ERRCHK(tl);
 	vcc_NextToken(tl);
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 84e849e..0067365 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -108,7 +108,7 @@ typedef void sym_expr_t(struct vcc *tl, struct expr **,
     struct symbol *sym, vcc_type_t);
 typedef void sym_wildcard_t(struct vcc *, struct symbol *, struct symbol *);
 
-typedef void sym_act_f(struct vcc *tl);
+typedef void sym_act_f(struct vcc *, struct symbol *);
 
 struct symbol {
 	unsigned			magic;
@@ -279,7 +279,7 @@ char *TlDup(struct vcc *tl, const char *s);
 
 /* vcc_expr.c */
 void vcc_Expr(struct vcc *tl, vcc_type_t typ);
-void vcc_Expr_Call(struct vcc *tl, struct symbol *sym);
+sym_act_f vcc_ParseCall;
 void vcc_Expr_Init(struct vcc *tl);
 sym_expr_t vcc_Eval_Var;
 sym_expr_t vcc_Eval_Handle;
@@ -294,7 +294,7 @@ void vcc_Var_Init(struct vcc *);
 
 /* vcc_parse.c */
 void vcc_Parse(struct vcc *tl);
-void vcc_ParseIf(struct vcc *tl);
+sym_act_f vcc_ParseIf;
 
 /* vcc_utils.c */
 const char *vcc_regexp(struct vcc *tl);
@@ -350,7 +350,7 @@ sym_wildcard_t vcc_Var_Wildcard;
 
 /* vcc_vmod.c */
 void vcc_ParseImport(struct vcc *tl);
-void vcc_ParseNew(struct vcc *tl);
+sym_act_f vcc_ParseNew;
 
 /* vcc_xref.c */
 void vcc_AddRef(struct vcc *, struct symbol *);
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index e4d2d20..d43f5e8 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -1261,8 +1261,8 @@ vcc_Expr(struct vcc *tl, vcc_type_t fmt)
 /*--------------------------------------------------------------------
  */
 
-void
-vcc_Expr_Call(struct vcc *tl, struct symbol *sym)
+void v_matchproto_(sym_act_f)
+vcc_ParseCall(struct vcc *tl, struct symbol *sym)
 {
 
 	struct expr *e;
@@ -1273,6 +1273,7 @@ vcc_Expr_Call(struct vcc *tl, struct symbol *sym)
 	vcc_Eval_SymFunc(tl, &e, sym, VOID);
 	if (!tl->err) {
 		vcc_expr_fmt(tl->fb, tl->indent, e);
+		SkipToken(tl, ';');
 		VSB_cat(tl->fb, ";\n");
 	} else if (t1 != tl->t) {
 		vcc_ErrWhere2(tl, t1, tl->t);
@@ -1290,11 +1291,13 @@ vcc_Expr_Init(struct vcc *tl)
 
 	sym = VCC_MkSym(tl, "regsub", SYM_FUNC);
 	AN(sym);
+	sym->action = vcc_ParseCall;
 	sym->eval = vcc_Eval_Regsub;
 	sym->eval_priv = NULL;
 
 	sym = VCC_MkSym(tl, "regsuball", SYM_FUNC);
 	AN(sym);
+	sym->action = vcc_ParseCall;
 	sym->eval = vcc_Eval_Regsub;
 	sym->eval_priv = sym;
 
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index 228a1d4..133024c 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -79,10 +79,11 @@ vcc_Conditional(struct vcc *tl)
  *	null
  */
 
-void
-vcc_ParseIf(struct vcc *tl)
+void v_matchproto_(sym_act_f)
+vcc_ParseIf(struct vcc *tl, struct symbol *sym)
 {
 
+	(void)sym;
 	SkipToken(tl, ID);
 	Fb(tl, 1, "if ");
 	vcc_Conditional(tl);
@@ -178,18 +179,14 @@ vcc_Compound(struct vcc *tl)
 			tl->err = 1;
 			return;
 		case ID:
-			sym = VCC_SymbolGet(tl, SYM_NONE, SYMTAB_NOERR, XREF_NONE);
+			sym = VCC_SymbolGet(tl, SYM_NONE, SYMTAB_NOERR,
+			    XREF_NONE);
 			if (sym != NULL && sym->action != NULL) {
 				if (sym->action_mask != 0)
 					vcc_AddUses(tl, t, NULL,
 					    sym->action_mask,
 					    "Not a valid action");
-				sym->action(tl);
-				break;
-			}
-			if (sym != NULL && sym->kind == SYM_FUNC) {
-				vcc_Expr_Call(tl, sym);
-				SkipToken(tl, ';');
+				sym->action(tl, sym);
 				break;
 			}
 			/* FALLTHROUGH */
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index 239aa88..416ac1d 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -245,6 +245,7 @@ vcc_ParseImport(struct vcc *tl)
 			sym = VCC_MkSym(tl, p, SYM_FUNC);
 			ERRCHK(tl);
 			AN(sym);
+			sym->action = vcc_ParseCall;
 			sym->vmod = msym->name;
 			sym->eval = vcc_Eval_SymFunc;
 			p += strlen(p) + 1;
@@ -265,8 +266,8 @@ vcc_ParseImport(struct vcc *tl)
 	Fh(tl, 0, "\n/* --- END VMOD %.*s --- */\n\n", PF(mod));
 }
 
-void
-vcc_ParseNew(struct vcc *tl)
+void v_matchproto_(sym_act_f)
+vcc_ParseNew(struct vcc *tl, struct symbol *sym)
 {
 	struct symbol *sy1, *sy2, *sy3;
 	struct inifin *ifp;
@@ -275,6 +276,7 @@ vcc_ParseNew(struct vcc *tl)
 	char buf1[128];
 	char buf2[128];
 
+	(void)sym;
 	vcc_NextToken(tl);
 	ExpectErr(tl, ID);
 	vcc_ExpectVid(tl, "VCL object");
@@ -335,6 +337,7 @@ vcc_ParseNew(struct vcc *tl)
 		bprintf(buf2, "%s%s", sy1->name, p);
 		sy3 = VCC_MkSym(tl, buf2, SYM_FUNC);
 		AN(sy3);
+		sy3->action = vcc_ParseCall;
 		sy3->eval = vcc_Eval_SymFunc;
 		p += strlen(p) + 1;
 		sy3->eval_priv = p;


More information about the varnish-commit mailing list