[master] cf5cc0a Have VCC emit code for VCL switching

Poul-Henning Kamp phk at FreeBSD.org
Tue Aug 16 11:20:16 CEST 2016


commit cf5cc0abb43dc12c48e40114eeb191ae2ad3eba0
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Aug 16 08:02:41 2016 +0000

    Have VCC emit code for VCL switching

diff --git a/include/tbl/symbol_kind.h b/include/tbl/symbol_kind.h
index 1ec18f4..92d7900 100644
--- a/include/tbl/symbol_kind.h
+++ b/include/tbl/symbol_kind.h
@@ -39,5 +39,6 @@ VCC_SYMB(PROBE,		probe)
 VCC_SYMB(STEVEDORE,	stevedore)
 VCC_SYMB(SUB,		sub)		/* VCL subroutine */
 VCC_SYMB(VAR,		var)
+VCC_SYMB(VCL,		vcl)		/* VCL program */
 VCC_SYMB(VMOD,		vmod)
 /*lint -restore */
diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index dcdfc14..4bcb801 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -191,6 +191,94 @@ parse_hash_data(struct vcc *tl)
 /*--------------------------------------------------------------------*/
 
 static void
+parse_return_synth(struct vcc *tl)
+{
+
+	AN(vcc_IdIs(tl->t, "synth"));
+	vcc_NextToken(tl);
+	if (tl->t->tok == ')') {
+		VSB_printf(tl->sb,
+		    "Syntax has changed, use:\n"
+		    "\treturn(synth(999));\n"
+		    "or\n"
+		    "\treturn(synth(999, \"Response text\"));\n");
+		vcc_ErrWhere(tl, tl->t);
+		return;
+	}
+	ExpectErr(tl, '(');
+	vcc_NextToken(tl);
+	Fb(tl, 1, "VRT_synth(ctx,\n");
+	tl->indent += INDENT;
+	vcc_Expr(tl, INT);
+	ERRCHK(tl);
+	Fb(tl, 1, ",\n");
+	if (tl->t->tok == ',') {
+		vcc_NextToken(tl);
+		vcc_Expr(tl, STRING);
+		ERRCHK(tl);
+	} else {
+		Fb(tl, 1, "(const char*)0\n");
+	}
+	tl->indent -= INDENT;
+	ExpectErr(tl, ')');
+	vcc_NextToken(tl);
+	Fb(tl, 1, ");\n");
+	Fb(tl, 1, "VRT_handling(ctx, VCL_RET_SYNTH);\n");
+	Fb(tl, 1, "return (1);\n");
+	vcc_ProcAction(tl->curproc, VCL_RET_SYNTH, tl->t);
+	ExpectErr(tl, ')');
+	vcc_NextToken(tl);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+parse_return_vcl(struct vcc *tl)
+{
+	struct symbol *sym;
+	struct inifin *p;
+	char buf[1024];
+
+	AN(vcc_IdIs(tl->t, "vcl"));
+	vcc_NextToken(tl);
+	ExpectErr(tl, '(');
+	vcc_NextToken(tl);
+	ExpectErr(tl, ID);
+	sym = VCC_SymbolTok(tl, NULL, tl->t, SYM_VCL, 0);
+	ERRCHK(tl);
+	if (sym == NULL) {
+		VSB_printf(tl->sb, "Not a VCL label:\n");
+		vcc_ErrWhere(tl, tl->t);
+		return;
+	}
+	if (sym->eval_priv == NULL) {
+
+		bprintf(buf, "vgc_vcl_%u", tl->unique++);
+		sym->eval_priv = strdup(buf);
+		AN(sym->eval_priv);
+
+		Fh(tl, 0, "static VCL_VCL %s;", sym->eval_priv);
+		Fh(tl, 0, "\t/* VCL %.*s */\n", PF(tl->t));
+
+		p = New_IniFin(tl);
+		AN(p);
+		VSB_printf(p->ini, "\t%s = VRT_vcl_lookup(\"%.*s\");",
+		    sym->eval_priv, PF(tl->t));
+	}
+	Fb(tl, 1, "VRT_vcl_select(ctx, %s);\t/* %.*s */\n",
+	    sym->eval_priv, PF(tl->t));
+	Fb(tl, 1, "VRT_handling(ctx, VCL_RET_VCL);\n");
+	Fb(tl, 1, "return (1);\n");
+	vcc_NextToken(tl);
+	ExpectErr(tl, ')');
+	vcc_NextToken(tl);
+	ExpectErr(tl, ')');
+	vcc_NextToken(tl);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
 parse_return(struct vcc *tl)
 {
 	int retval = 0;
@@ -200,41 +288,12 @@ parse_return(struct vcc *tl)
 	vcc_NextToken(tl);
 	ExpectErr(tl, ID);
 
-	/* 'error' gets special handling, to allow optional status/response */
 	if (vcc_IdIs(tl->t, "synth")) {
-		vcc_NextToken(tl);
-		if (tl->t->tok == ')') {
-			VSB_printf(tl->sb,
-			    "Syntax has changed, use:\n"
-			    "\treturn(synth(999));\n"
-			    "or\n"
-			    "\treturn(synth(999, \"Response text\"));\n");
-			vcc_ErrWhere(tl, tl->t);
-			return;
-		}
-		ExpectErr(tl, '(');
-		vcc_NextToken(tl);
-		Fb(tl, 1, "VRT_synth(ctx,\n");
-		tl->indent += INDENT;
-		vcc_Expr(tl, INT);
-		ERRCHK(tl);
-		Fb(tl, 1, ",\n");
-		if (tl->t->tok == ',') {
-			vcc_NextToken(tl);
-			vcc_Expr(tl, STRING);
-			ERRCHK(tl);
-		} else {
-			Fb(tl, 1, "(const char*)0\n");
-		}
-		tl->indent -= INDENT;
-		ExpectErr(tl, ')');
-		vcc_NextToken(tl);
-		Fb(tl, 1, ");\n");
-		Fb(tl, 1, "VRT_handling(ctx, VCL_RET_SYNTH);\n");
-		Fb(tl, 1, "return (1);\n");
-		vcc_ProcAction(tl->curproc, VCL_RET_SYNTH, tl->t);
-		ExpectErr(tl, ')');
-		vcc_NextToken(tl);
+		parse_return_synth(tl);
+		return;
+	}
+	if (vcc_IdIs(tl->t, "vcl")) {
+		parse_return_vcl(tl);
 		return;
 	}
 
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 574d844..b2542a6 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -811,13 +811,26 @@ VCC_Unsafe_Path(struct vcc *vcc, unsigned u)
  * Configure settings
  */
 
+static void
+vcc_predef_vcl(struct vcc *vcc, const char *name)
+{
+	struct symbol *sym;
+
+	sym = VCC_Symbol(vcc, NULL, name, NULL, SYM_VCL, 1);
+	AN(sym);
+	sym->fmt = VCL;
+	sym->r_methods = VCL_MET_RECV;
+}
+
 void
 VCC_Predef(struct vcc *vcc, const char *type, const char *name)
 {
+
+	CHECK_OBJ_NOTNULL(vcc, VCC_MAGIC);
 	if (!strcmp(type, "VCL_STEVEDORE"))
 		vcc_stevedore(vcc, name);
 	else if (!strcmp(type, "VCL_VCL"))
-		return;
+		vcc_predef_vcl(vcc, name);
 	else
 		WRONG("Unknown VCC predef type");
 }



More information about the varnish-commit mailing list