[4.1] 7c73f98 Split the parameters for the VCC compiler into a separate structure for more clarity, before we start hacking VCC further.

Lasse Karstensen lkarsten at varnish-software.com
Thu Jan 14 15:15:12 CET 2016


commit 7c73f98ad1062b85dc11ea6483aae248f52fbc4f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Jan 8 10:32:18 2016 +0000

    Split the parameters for the VCC compiler into a separate structure
    for more clarity, before we start hacking VCC further.

diff --git a/bin/varnishd/mgt/mgt_vcc.c b/bin/varnishd/mgt/mgt_vcc.c
index d13432e..9d28804 100644
--- a/bin/varnishd/mgt/mgt_vcc.c
+++ b/bin/varnishd/mgt/mgt_vcc.c
@@ -64,7 +64,7 @@ unsigned mgt_vcc_err_unref;
 unsigned mgt_vcc_allow_inline_c;
 unsigned mgt_vcc_unsafe_path;
 
-static struct vcc *vcc;
+static struct vcp *vcp;
 
 #define VGC_SRC		"vgc.c"
 #define VGC_LIB		"vgc.so"
@@ -94,12 +94,12 @@ run_vcc(void *priv)
 
 	sb = VSB_new_auto();
 	XXXAN(sb);
-	VCC_VCL_dir(vcc, mgt_vcl_dir);
-	VCC_VMOD_dir(vcc, mgt_vmod_dir);
-	VCC_Err_Unref(vcc, mgt_vcc_err_unref);
-	VCC_Allow_InlineC(vcc, mgt_vcc_allow_inline_c);
-	VCC_Unsafe_Path(vcc, mgt_vcc_unsafe_path);
-	csrc = VCC_Compile(vcc, sb, vp->src);
+	VCP_VCL_dir(vcp, mgt_vcl_dir);
+	VCP_VMOD_dir(vcp, mgt_vmod_dir);
+	VCP_Err_Unref(vcp, mgt_vcc_err_unref);
+	VCP_Allow_InlineC(vcp, mgt_vcc_allow_inline_c);
+	VCP_Unsafe_Path(vcp, mgt_vcc_unsafe_path);
+	csrc = VCC_Compile(vcp, sb, vp->src);
 	AZ(VSB_finish(sb));
 	if (VSB_len(sb))
 		printf("%s", VSB_data(sb));
@@ -318,7 +318,7 @@ void
 mgt_vcc_init(void)
 {
 
-	vcc = VCC_New();
-	AN(vcc);
-	VCC_Builtin_VCL(vcc, builtin_vcl);
+	vcp = VCP_New();
+	AN(vcp);
+	VCP_Builtin_VCL(vcp, builtin_vcl);
 }
diff --git a/include/libvcc.h b/include/libvcc.h
index 6b16252..696123e 100644
--- a/include/libvcc.h
+++ b/include/libvcc.h
@@ -30,12 +30,12 @@
 
 struct vcc;
 
-struct vcc *VCC_New(void);
-void VCC_Builtin_VCL(struct vcc *, const char *str);
-void VCC_VCL_dir(struct vcc *, const char *str);
-void VCC_VMOD_dir(struct vcc *, const char *str);
-void VCC_Err_Unref(struct vcc *tl, unsigned u);
-void VCC_Allow_InlineC(struct vcc *tl, unsigned u);
-void VCC_Unsafe_Path(struct vcc *tl, unsigned u);
+struct vcp *VCP_New(void);
+void VCP_Builtin_VCL(struct vcp *, const char *str);
+void VCP_VCL_dir(struct vcp *, const char *str);
+void VCP_VMOD_dir(struct vcp *, const char *str);
+void VCP_Err_Unref(struct vcp *tl, unsigned u);
+void VCP_Allow_InlineC(struct vcp *tl, unsigned u);
+void VCP_Unsafe_Path(struct vcp *tl, unsigned u);
 
-char *VCC_Compile(const struct vcc *, struct vsb *sb, const char *b);
+char *VCC_Compile(const struct vcp *, struct vsb *sb, const char *b);
diff --git a/lib/libvcc/vcc_acl.c b/lib/libvcc/vcc_acl.c
index b5ee224..78d9ec5 100644
--- a/lib/libvcc/vcc_acl.c
+++ b/lib/libvcc/vcc_acl.c
@@ -364,7 +364,7 @@ vcc_acl_emit(struct vcc *tl, const char *acln, int anon)
 	Fh(tl, 0, "\t\tVRT_acl_log(ctx, \"NO_FAM %s\");\n", acln);
 	Fh(tl, 0, "\t\treturn(0);\n");
 	Fh(tl, 0, "\t}\n\n");
-	if (!tl->err_unref && !anon ) {
+	if (!tl->param->err_unref && !anon ) {
 		ifp = New_IniFin(tl);
 		VSB_printf(ifp->ini,
 			"\tif (0) match_acl_named_%s(0, 0);\n", acln);
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index e79597f..aaba4bf 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -450,16 +450,16 @@ vcc_destroy_source(struct source *sp)
 /*--------------------------------------------------------------------*/
 
 static struct source *
-vcc_file_source(const struct vcc *tl, struct vsb *sb, const char *fn)
+vcc_file_source(const struct vcp * const vcp, struct vsb *sb, const char *fn)
 {
 	char *f;
 	struct source *sp;
 
-	if (!tl->unsafe_path && strchr(fn, '/') != NULL) {
+	if (!vcp->unsafe_path && strchr(fn, '/') != NULL) {
 		VSB_printf(sb, "Include path is unsafe '%s'\n", fn);
 		return (NULL);
 	}
-	f = VFIL_readfile(tl->vcl_dir, fn, NULL);
+	f = VFIL_readfile(vcp->vcl_dir, fn, NULL);
 	if (f == NULL) {
 		VSB_printf(sb, "Cannot read file '%s': %s\n",
 		    fn, strerror(errno));
@@ -500,7 +500,7 @@ vcc_resolve_includes(struct vcc *tl)
 			return;
 		}
 
-		sp = vcc_file_source(tl, tl->sb, t1->dec);
+		sp = vcc_file_source(tl->param, tl->sb, t1->dec);
 		if (sp == NULL) {
 			vcc_ErrWhere(tl, t1);
 			return;
@@ -522,24 +522,16 @@ vcc_resolve_includes(struct vcc *tl)
 /*--------------------------------------------------------------------*/
 
 static struct vcc *
-vcc_NewVcc(const struct vcc *tl0)
+vcc_NewVcc(const struct vcp *vcp)
 {
 	struct vcc *tl;
 	int i;
 
+	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
 	ALLOC_OBJ(tl, VCC_MAGIC);
 	AN(tl);
-	if (tl0 != NULL) {
-		REPLACE(tl->builtin_vcl, tl0->builtin_vcl);
-		REPLACE(tl->vcl_dir, tl0->vcl_dir);
-		REPLACE(tl->vmod_dir, tl0->vmod_dir);
-		tl->vars = tl0->vars;
-		tl->err_unref = tl0->err_unref;
-		tl->allow_inline_c = tl0->allow_inline_c;
-		tl->unsafe_path = tl0->unsafe_path;
-	} else {
-		tl->err_unref = 1;
-	}
+	tl->param = vcp;
+	tl->vars = vcc_vars;
 	VTAILQ_INIT(&tl->symbols);
 	VTAILQ_INIT(&tl->inifin);
 	VTAILQ_INIT(&tl->membits);
@@ -606,7 +598,8 @@ vcc_DestroyTokenList(struct vcc *tl, char *ret)
  */
 
 static char *
-vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
+vcc_CompileSource(const struct vcp * const vcp, struct vsb *sb,
+    struct source *sp)
 {
 	struct vcc *tl;
 	struct symbol *sym;
@@ -616,7 +609,7 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
 	char *of;
 	int i;
 
-	tl = vcc_NewVcc(tl0);
+	tl = vcc_NewVcc(vcp);
 	tl->sb = sb;
 
 	vcc_Expr_Init(tl);
@@ -649,7 +642,7 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
 		return (vcc_DestroyTokenList(tl, NULL));
 
 	/* Register and lex the builtin VCL */
-	sp = vcc_new_source(tl->builtin_vcl, NULL, "Builtin");
+	sp = vcc_new_source(tl->param->builtin_vcl, NULL, "Builtin");
 	assert(sp != NULL);
 	VTAILQ_INSERT_TAIL(&tl->sources, sp, list);
 	sp->idx = tl->nsources++;
@@ -759,7 +752,7 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
  */
 
 char *
-VCC_Compile(const struct vcc *tl, struct vsb *sb, const char *b)
+VCC_Compile(const struct vcp *vcp, struct vsb *sb, const char *b)
 {
 	struct source *sp;
 	char *r;
@@ -767,7 +760,7 @@ VCC_Compile(const struct vcc *tl, struct vsb *sb, const char *b)
 	sp = vcc_new_source(b, NULL, "input");
 	if (sp == NULL)
 		return (NULL);
-	r = vcc_CompileSource(tl, sb, sp);
+	r = vcc_CompileSource(vcp, sb, sp);
 	return (r);
 }
 
@@ -775,16 +768,15 @@ VCC_Compile(const struct vcc *tl, struct vsb *sb, const char *b)
  * Allocate a compiler instance
  */
 
-struct vcc *
-VCC_New(void)
+struct vcp *
+VCP_New(void)
 {
-	struct vcc *tl;
+	struct vcp *vcp;
 
-	tl = vcc_NewVcc(NULL);
+	ALLOC_OBJ(vcp, VCP_MAGIC);
+	AN(vcp);
 
-	tl->vars = vcc_vars;
-
-	return (tl);
+	return (vcp);
 }
 
 /*--------------------------------------------------------------------
@@ -792,11 +784,11 @@ VCC_New(void)
  */
 
 void
-VCC_Builtin_VCL(struct vcc *tl, const char *str)
+VCP_Builtin_VCL(struct vcp *vcp, const char *str)
 {
 
-	CHECK_OBJ_NOTNULL(tl, VCC_MAGIC);
-	REPLACE(tl->builtin_vcl, str);
+	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
+	REPLACE(vcp->builtin_vcl, str);
 }
 
 /*--------------------------------------------------------------------
@@ -804,11 +796,11 @@ VCC_Builtin_VCL(struct vcc *tl, const char *str)
  */
 
 void
-VCC_VCL_dir(struct vcc *tl, const char *str)
+VCP_VCL_dir(struct vcp *vcp, const char *str)
 {
 
-	CHECK_OBJ_NOTNULL(tl, VCC_MAGIC);
-	REPLACE(tl->vcl_dir, str);
+	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
+	REPLACE(vcp->vcl_dir, str);
 }
 
 /*--------------------------------------------------------------------
@@ -816,11 +808,11 @@ VCC_VCL_dir(struct vcc *tl, const char *str)
  */
 
 void
-VCC_VMOD_dir(struct vcc *tl, const char *str)
+VCP_VMOD_dir(struct vcp *vcp, const char *str)
 {
 
-	CHECK_OBJ_NOTNULL(tl, VCC_MAGIC);
-	REPLACE(tl->vmod_dir, str);
+	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
+	REPLACE(vcp->vmod_dir, str);
 }
 
 /*--------------------------------------------------------------------
@@ -828,25 +820,25 @@ VCC_VMOD_dir(struct vcc *tl, const char *str)
  */
 
 void
-VCC_Err_Unref(struct vcc *tl, unsigned u)
+VCP_Err_Unref(struct vcp *vcp, unsigned u)
 {
 
-	CHECK_OBJ_NOTNULL(tl, VCC_MAGIC);
-	tl->err_unref = u;
+	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
+	vcp->err_unref = u;
 }
 
 void
-VCC_Allow_InlineC(struct vcc *tl, unsigned u)
+VCP_Allow_InlineC(struct vcp *vcp, unsigned u)
 {
 
-	CHECK_OBJ_NOTNULL(tl, VCC_MAGIC);
-	tl->allow_inline_c = u;
+	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
+	vcp->allow_inline_c = u;
 }
 
 void
-VCC_Unsafe_Path(struct vcc *tl, unsigned u)
+VCP_Unsafe_Path(struct vcp *vcp, unsigned u)
 {
 
-	CHECK_OBJ_NOTNULL(tl, VCC_MAGIC);
-	tl->unsafe_path = u;
+	CHECK_OBJ_NOTNULL(vcp, VCP_MAGIC);
+	vcp->unsafe_path = u;
 }
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 4c155a1..72ff7b7 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -155,14 +155,24 @@ struct inifin {
 
 VTAILQ_HEAD(inifinhead, inifin);
 
-struct vcc {
+struct vcp {
 	unsigned		magic;
-#define VCC_MAGIC		0x24ad719d
+#define VCP_MAGIC		0xd90acfbc
 
-	/* Parameter/Template section */
 	char			*builtin_vcl;
 	char			*vcl_dir;
 	char			*vmod_dir;
+	unsigned		err_unref;
+	unsigned		allow_inline_c;
+	unsigned		unsafe_path;
+};
+
+struct vcc {
+	unsigned		magic;
+#define VCC_MAGIC		0x24ad719d
+
+	/* Parameter/Template section */
+	const struct vcp	*param;
 
 	const struct var	*vars;
 	VTAILQ_HEAD(, symbol)	symbols;
@@ -202,9 +212,6 @@ struct vcc {
 
 	unsigned		unique;
 
-	unsigned		err_unref;
-	unsigned		allow_inline_c;
-	unsigned		unsafe_path;
 };
 
 struct var {
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index accabd6..8a94749 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -160,7 +160,7 @@ vcc_Compound(struct vcc *tl)
 			Fb(tl, 1, "}\n");
 			return;
 		case CSRC:
-			if (tl->allow_inline_c) {
+			if (tl->param->allow_inline_c) {
 				Fb(tl, 1, "%.*s\n",
 				    (int) (tl->t->e - (tl->t->b + 2)),
 				    tl->t->b + 1);
@@ -357,7 +357,7 @@ vcc_Parse(struct vcc *tl)
 		ERRCHK(tl);
 		switch (tl->t->tok) {
 		case CSRC:
-			if (tl->allow_inline_c) {
+			if (tl->param->allow_inline_c) {
 				Fc(tl, 0, "%.*s\n",
 				    (int) (tl->t->e - (tl->t->b + 4)),
 				    tl->t->b + 2);
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index 60d2ed2..d82ad3e 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -85,7 +85,7 @@ vcc_ParseImport(struct vcc *tl)
 	sym->def_e = tl->t;
 
 	if (tl->t->tok == ID) {
-		if (!tl->unsafe_path) {
+		if (!tl->param->unsafe_path) {
 			VSB_printf(tl->sb,
 			    "'import ... from path ...' not allowed.\nAt:");
 			vcc_ErrToken(tl, tl->t);
@@ -102,7 +102,7 @@ vcc_ParseImport(struct vcc *tl)
 		bprintf(fn, "%s", tl->t->dec);
 		vcc_NextToken(tl);
 	} else {
-		bprintf(fn, "%s/libvmod_%.*s.so", tl->vmod_dir, PF(mod));
+		bprintf(fn, "%s/libvmod_%.*s.so", tl->param->vmod_dir, PF(mod));
 	}
 
 	SkipToken(tl, ';');
diff --git a/lib/libvcc/vcc_xref.c b/lib/libvcc/vcc_xref.c
index c3ef375..5440829 100644
--- a/lib/libvcc/vcc_xref.c
+++ b/lib/libvcc/vcc_xref.c
@@ -108,7 +108,7 @@ vcc_checkref(struct vcc *tl, const struct symbol *sym)
 		VSB_printf(tl->sb, "Unused %s %.*s, defined:\n",
 		    VCC_SymKind(tl, sym), PF(sym->def_b));
 		vcc_ErrWhere(tl, sym->def_b);
-		if (!tl->err_unref) {
+		if (!tl->param->err_unref) {
 			VSB_printf(tl->sb, "(That was just a warning)\n");
 			tl->err = 0;
 		}
@@ -289,7 +289,7 @@ vcc_checkaction2(struct vcc *tl, const struct symbol *sym)
 		return;
 	VSB_printf(tl->sb, "Function unused\n");
 	vcc_ErrWhere(tl, p->name);
-	if (!tl->err_unref) {
+	if (!tl->param->err_unref) {
 		VSB_printf(tl->sb, "(That was just a warning)\n");
 		tl->err = 0;
 	}



More information about the varnish-commit mailing list