r1284 - in trunk/varnish-cache: bin/varnishd include lib/libvcl

phk at projects.linpro.no phk at projects.linpro.no
Sat Mar 24 23:09:53 CET 2007


Author: phk
Date: 2007-03-24 23:09:53 +0100 (Sat, 24 Mar 2007)
New Revision: 1284

Modified:
   trunk/varnish-cache/bin/varnishd/mgt_vcc.c
   trunk/varnish-cache/include/vcl_returns.h
   trunk/varnish-cache/lib/libvcl/vcc_compile.c
   trunk/varnish-cache/lib/libvcl/vcc_compile.h
   trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl
   trunk/varnish-cache/lib/libvcl/vcc_parse.c
Log:
Twist the compiler logic around a bit.

Concatenate all definitions of the method functions into one
instance of the function:

	sub vcl_pipe {
		foo;
	}

	sub vcl_pipe {
		bar;
	}

is now the same as

	sub vcl_pipe {
		foo;
		bar;
	}

This avoids all the magic related to the default functions and
hopefully makes the newly introduced "include" facility much more
useful.



Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_vcc.c	2007-03-24 21:01:43 UTC (rev 1283)
+++ trunk/varnish-cache/bin/varnishd/mgt_vcc.c	2007-03-24 22:09:53 UTC (rev 1284)
@@ -66,7 +66,7 @@
 
 /* keep this in synch with man/vcl.7 */
 static const char *default_vcl =
-    "sub default_vcl_recv {\n"
+    "sub vcl_recv {\n"
     "    if (req.request != \"GET\" && req.request != \"HEAD\") {\n"
     "        pipe;\n"
     "    }\n"
@@ -79,30 +79,30 @@
     "    lookup;\n"
     "}\n"
     "\n"
-    "sub default_vcl_pipe {\n"
+    "sub vcl_pipe {\n"
     "    pipe;\n"
     "}\n"
     "\n"
-    "sub default_vcl_pass {\n"
+    "sub vcl_pass {\n"
     "    pass;\n"
     "}\n"
     "\n"
-    "sub default_vcl_hash {\n"
+    "sub vcl_hash {\n"
     "    hash;\n"
     "}\n"
     "\n"
-    "sub default_vcl_hit {\n"
+    "sub vcl_hit {\n"
     "    if (!obj.cacheable) {\n"
     "        pass;\n"
     "    }\n"
     "    deliver;\n"
     "}\n"
     "\n"
-    "sub default_vcl_miss {\n"
+    "sub vcl_miss {\n"
     "    fetch;\n"
     "}\n"
     "\n"
-    "sub default_vcl_fetch {\n"
+    "sub vcl_fetch {\n"
     "    if (!obj.valid) {\n"
     "        error;\n"
     "    }\n"
@@ -114,7 +114,7 @@
     "    }\n"
     "    insert;\n"
     "}\n"
-    "sub default_vcl_timeout {\n"
+    "sub vcl_timeout {\n"
     "    discard;\n"
     "}\n";
 

Modified: trunk/varnish-cache/include/vcl_returns.h
===================================================================
--- trunk/varnish-cache/include/vcl_returns.h	2007-03-24 21:01:43 UTC (rev 1283)
+++ trunk/varnish-cache/include/vcl_returns.h	2007-03-24 22:09:53 UTC (rev 1284)
@@ -41,3 +41,4 @@
 VCL_MET_MAC(fetch,FETCH,(VCL_RET_ERROR|VCL_RET_PASS|VCL_RET_INSERT))
 VCL_MET_MAC(timeout,TIMEOUT,(VCL_RET_FETCH|VCL_RET_DISCARD))
 #endif
+#define N_METHODS 8

Modified: trunk/varnish-cache/lib/libvcl/vcc_compile.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_compile.c	2007-03-24 21:01:43 UTC (rev 1283)
+++ trunk/varnish-cache/lib/libvcl/vcc_compile.c	2007-03-24 22:09:53 UTC (rev 1284)
@@ -87,7 +87,7 @@
 
 static struct method method_tab[] = {
 #define VCL_RET_MAC(l,U,b,n)
-#define VCL_MET_MAC(l,U,m)	{ "vcl_"#l, "default_vcl_"#l, m },
+#define VCL_MET_MAC(l,U,m)	{ "vcl_"#l, m },
 #include "vcl_returns.h"
 #undef VCL_MET_MAC
 #undef VCL_RET_MAC
@@ -96,8 +96,22 @@
 
 /*--------------------------------------------------------------------*/
 
-const char *vcc_default_vcl_b, *vcc_default_vcl_e;
+static const char *vcc_default_vcl_b, *vcc_default_vcl_e;
 
+/*--------------------------------------------------------------------*/
+
+int
+IsMethod(struct token *t)
+{
+	struct method *m;
+
+	for(m = method_tab; m->name != NULL; m++) {
+		if (vcc_IdIs(t, m->name))
+			return (m - method_tab);
+	}
+	return (-1);
+}
+
 /*--------------------------------------------------------------------
  * Printf output to the two vsbs, possibly indented
  */
@@ -115,6 +129,19 @@
 }
 
 void
+Fb(struct tokenlist *tl, int indent, const char *fmt, ...)
+{
+	va_list ap;
+
+	assert(tl->fb != NULL);
+	if (indent)
+		vsb_printf(tl->fb, "%*.*s", tl->indent, tl->indent, "");
+	va_start(ap, fmt);
+	vsb_vprintf(tl->fb, fmt, ap);
+	va_end(ap);
+}
+
+void
 Fc(struct tokenlist *tl, int indent, const char *fmt, ...)
 {
 	va_list ap;
@@ -152,8 +179,8 @@
 
 /*--------------------------------------------------------------------*/
 
-void
-EncString(struct vsb *sb, const char *b, const char *e)
+static void
+EncString(struct vsb *sb, const char *b, const char *e, int mode)
 {
 
 	if (e == NULL)
@@ -166,7 +193,11 @@
 		case '"':
 			vsb_printf(sb, "\\%c", *b);
 			break;
-		case '\n': vsb_printf(sb, "\\n"); break;
+		case '\n':
+			vsb_printf(sb, "\\n");
+			if (mode) 
+				vsb_printf(sb, "\"\n\t\"");
+			break;
 		case '\t': vsb_printf(sb, "\\t"); break;
 		case '\r': vsb_printf(sb, "\\r"); break;
 		case ' ': vsb_printf(sb, " "); break;
@@ -186,7 +217,7 @@
 {
 
 	assert(t->tok == CSTR);
-	EncString(sb, t->dec, NULL);
+	EncString(sb, t->dec, NULL, 0);
 }
 
 /*--------------------------------------------------------------------
@@ -212,20 +243,6 @@
 	return (r);
 }
 
-static int
-FindRefStr(struct tokenlist *tl, const char *s, enum ref_type type)
-{
-	struct ref *r;
-
-	TAILQ_FOREACH(r, &tl->refs, list) {
-		if (r->type != type)
-			continue;
-		if (vcc_IdIs(r->name, s))
-			return (1);
-	}
-	return (0);
-}
-
 void
 AddRef(struct tokenlist *tl, struct token *t, enum ref_type type)
 {
@@ -233,20 +250,6 @@
 	FindRef(tl, t, type)->refcnt++;
 }
 
-static void
-AddRefStr(struct tokenlist *tl, const char *s, enum ref_type type)
-{
-	struct token *t;
-
-	t = calloc(sizeof *t, 1);
-	assert(t != NULL);
-	t->b = s;
-	t->e = strchr(s, '\0');
-	t->tok = METHOD;
-	AddRef(tl, t, type);
-	/* XXX: possibly leaking t */
-}
-
 void
 AddDef(struct tokenlist *tl, struct token *t, enum ref_type type)
 {
@@ -407,8 +410,6 @@
 
 	TAILQ_FOREACH(p, &tl->procs, list) {
 		for(m = method_tab; m->name != NULL; m++) {
-			if (vcc_IdIs(p->name, m->defname))
-				p->called = 1;
 			if (vcc_IdIs(p->name, m->name))
 				break;
 		}
@@ -564,15 +565,18 @@
 	Fc(tl, 0, "\nconst char *srcname[%u] = {\n", tl->nsources);
 	TAILQ_FOREACH(sp, &tl->sources, list) {
 		Fc(tl, 0, "\t");
-		EncString(tl->fc, sp->name, NULL);
+		EncString(tl->fc, sp->name, NULL, 0);
 		Fc(tl, 0, ",\n");
 	}
 	Fc(tl, 0, "};\n");
 	
 	Fc(tl, 0, "\nconst char *srcbody[%u] = {\n", tl->nsources);
 	TAILQ_FOREACH(sp, &tl->sources, list) {
+		Fc(tl, 0, "    /* ");
+		EncString(tl->fc, sp->name, NULL, 0);
+		Fc(tl, 0, "*/\n");
 		Fc(tl, 0, "\t");
-		EncString(tl->fc, sp->b, sp->e);
+		EncString(tl->fc, sp->b, sp->e, 1);
 		Fc(tl, 0, ",\n");
 	}
 	Fc(tl, 0, "};\n");
@@ -589,13 +593,7 @@
 	Fc(tl, 0, "\t.srcbody = srcbody,\n");
 #define VCL_RET_MAC(l,u,b,n)
 #define VCL_MET_MAC(l,u,b) \
-	if (FindRefStr(tl, "vcl_" #l, R_FUNC)) { \
-		Fc(tl, 0, "\t." #l "_func = VGC_function_vcl_" #l ",\n"); \
-		AddRefStr(tl, "vcl_" #l, R_FUNC); \
-	} else { \
-		Fc(tl, 0, "\t." #l "_func = VGC_function_default_vcl_" #l ",\n"); \
-	} \
-	AddRefStr(tl, "default_vcl_" #l, R_FUNC);
+	Fc(tl, 0, "\t." #l "_func = VGC_function_vcl_" #l ",\n"); 
 #include "vcl_returns.h"
 #undef VCL_MET_MAC
 #undef VCL_RET_MAC
@@ -744,11 +742,10 @@
 	assert(tl->ff != NULL);
 
 	/* body code of methods */
-#define VCL_MET_MAC(l,U,m) \
-		tl->fm_##l = vsb_new(NULL, NULL, 0, VSB_AUTOEXTEND); \
-		assert(tl->fm_##l != NULL);
-#include "vcl_returns.h"
-#undef VCL_MET_MAC
+	for (i = 0; i < N_METHODS; i++) {
+		tl->fm[i] = vsb_new(NULL, NULL, 0, VSB_AUTOEXTEND); \
+		assert(tl->fm[i] != NULL);
+	}
 
 	Fh(tl, 0, "extern struct VCL_conf VCL_conf;\n");
 
@@ -779,6 +776,18 @@
 	Consistency(tl);
 	if (tl->err)
 		goto done;
+
+	/* Emit method functions */
+	for (i = 0; i < N_METHODS; i++) {
+		Fc(tl, 1, "static int\n");
+		Fc(tl, 1, "VGC_function_%s (struct sess *sp)\n",
+		    method_tab[i].name);
+		vsb_finish(tl->fm[i]);
+		Fc(tl, 1, "{\n");
+		Fc(tl, 1, "%s", vsb_data(tl->fm[i]));
+		Fc(tl, 1, "}\n\n");
+	}
+
 	LocTable(tl);
 
 	Ff(tl, 0, "\tVRT_free_backends(&VCL_conf);\n");
@@ -824,9 +833,8 @@
 	}
 done:
 
-#define VCL_MET_MAC(l,U,m) vsb_delete(tl->fm_##l);
-#include "vcl_returns.h"
-#undef VCL_MET_MAC
+	for (i = 0; i < N_METHODS; i++)
+		vsb_delete(tl->fm[i]);
 
 	/* Free References */
 	while (!TAILQ_EMPTY(&tl->refs)) {

Modified: trunk/varnish-cache/lib/libvcl/vcc_compile.h
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_compile.h	2007-03-24 21:01:43 UTC (rev 1283)
+++ trunk/varnish-cache/lib/libvcl/vcc_compile.h	2007-03-24 22:09:53 UTC (rev 1284)
@@ -62,16 +62,15 @@
 	struct token		*t;
 	int			indent;
 	unsigned		cnt;
-	struct vsb		*fc, *fh, *fi, *ff;
-#define VCL_MET_MAC(l,U,m) struct vsb *fm_##l;
-#include "vcl_returns.h"
-#undef VCL_MET_MAC
+	struct vsb		*fc, *fh, *fi, *ff, *fb;
+	struct vsb		*fm[N_METHODS];
 	TAILQ_HEAD(, ref)	refs;
 	struct vsb		*sb;
 	int			err;
 	int			nbackend;
 	TAILQ_HEAD(, proc)	procs;
 	struct proc		*curproc;
+	struct proc		*mprocs[N_METHODS];
 
 	unsigned		recnt;
 };
@@ -115,7 +114,6 @@
 
 struct method {
 	const char		*name;
-	const char		*defname;
 	unsigned		returns;
 };
 
@@ -145,19 +143,19 @@
 void vcc_Cond_Ip(struct var *vp, struct tokenlist *tl);
 
 /* vcc_compile.c */
-extern const char *vcc_default_vcl_b, *vcc_default_vcl_e;
 void Fh(struct tokenlist *tl, int indent, const char *fmt, ...);
 void Fc(struct tokenlist *tl, int indent, const char *fmt, ...);
+void Fb(struct tokenlist *tl, int indent, const char *fmt, ...);
 void Fi(struct tokenlist *tl, int indent, const char *fmt, ...);
 void Ff(struct tokenlist *tl, int indent, const char *fmt, ...);
 unsigned UintVal(struct tokenlist *tl);
 void AddDef(struct tokenlist *tl, struct token *t, enum ref_type type);
 void AddRef(struct tokenlist *tl, struct token *t, enum ref_type type);
 void EncToken(struct vsb *sb, struct token *t);
-void EncString(struct vsb *sb, const char *b, const char *e);
 struct var *FindVar(struct tokenlist *tl, struct token *t, struct var *vl);
 void AddCall(struct tokenlist *tl, struct token *t);
 struct proc *AddProc(struct tokenlist *tl, struct token *t, int def);
+int IsMethod(struct token *t);
 
 /* vcc_obj.c */
 extern struct var vcc_be_vars[];

Modified: trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl	2007-03-24 21:01:43 UTC (rev 1283)
+++ trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl	2007-03-24 22:09:53 UTC (rev 1284)
@@ -185,6 +185,7 @@
 puts $for "#endif"
 puts $for ""
 puts $for "#ifdef VCL_MET_MAC"
+set u 0
 foreach m $methods {
 	puts -nonewline $for "VCL_MET_MAC([lindex $m 0]"
 	puts -nonewline $for ",[string toupper [lindex $m 0]]"
@@ -195,8 +196,10 @@
 	}
 	puts -nonewline $for ")"
 	puts $for ")"
+	incr u
 }
 puts $for "#endif"
+puts $for "#define N_METHODS $u"
 close $for
 
 #----------------------------------------------------------------------

Modified: trunk/varnish-cache/lib/libvcl/vcc_parse.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_parse.c	2007-03-24 21:01:43 UTC (rev 1283)
+++ trunk/varnish-cache/lib/libvcl/vcc_parse.c	2007-03-24 22:09:53 UTC (rev 1284)
@@ -85,20 +85,10 @@
 #include "vrt.h"
 #include "libvcl.h"
 
-static struct method method_tab[] = {
-#define VCL_RET_MAC(l,U,b,n)
-#define VCL_MET_MAC(l,U,m)	{ "vcl_"#l, "default_vcl_"#l, m },
-#include "vcl_returns.h"
-#undef VCL_MET_MAC
-#undef VCL_RET_MAC
-	{ NULL, 0U }
-};
-
 /*--------------------------------------------------------------------*/
 
 static void Compound(struct tokenlist *tl);
 static void Cond_0(struct tokenlist *tl);
-const char *vcc_default_vcl_b, *vcc_default_vcl_e;
 
 /*--------------------------------------------------------------------*/
 
@@ -109,26 +99,10 @@
 } while (0)
 
 #define C(tl, sep)	do {					\
-	Fc(tl, 1, "VRT_count(sp, %u)%s\n", ++tl->cnt, sep);	\
+	Fb(tl, 1, "VRT_count(sp, %u)%s\n", ++tl->cnt, sep);	\
 	tl->t->cnt = tl->cnt; 					\
 } while (0)
 
-/*--------------------------------------------------------------------*/
-
-static int
-IsMethod(struct token *t)
-{
-	struct method *m;
-
-	for(m = method_tab; m->name != NULL; m++) {
-		if (vcc_IdIs(t, m->defname))
-			return (2);
-		if (vcc_IdIs(t, m->name))
-			return (1);
-	}
-	return (0);
-}
-
 /*--------------------------------------------------------------------
  * Recognize and convert units of time, return seconds.
  */
@@ -264,7 +238,7 @@
 	v = DoubleVal(tl);
 	ExpectErr(tl, ID);
 	sc = TimeUnit(tl);
-	Fc(tl, 0, "(%g * %g)", v, sc);
+	Fb(tl, 0, "(%g * %g)", v, sc);
 }
 
 static void
@@ -275,7 +249,7 @@
 	v = DoubleVal(tl);
 	ExpectErr(tl, ID);
 	sc = SizeUnit(tl);
-	Fc(tl, 0, "(%g * %g)", v, sc);
+	Fb(tl, 0, "(%g * %g)", v, sc);
 }
 
 static void
@@ -286,7 +260,7 @@
 	v = DoubleVal(tl);
 	ExpectErr(tl, ID);
 	sc = RateUnit(tl);
-	Fc(tl, 0, "(%g * %g)", v, sc);
+	Fb(tl, 0, "(%g * %g)", v, sc);
 }
 
 /*--------------------------------------------------------------------*/
@@ -303,7 +277,7 @@
 	}
 	sprintf(buf, "VGC_re_%u", tl->recnt++);
 
-	Fc(tl, 1, "VRT_re_match(%s, %s)\n", str, buf);
+	Fb(tl, 1, "VRT_re_match(%s, %s)\n", str, buf);
 	Fh(tl, 0, "void *%s;\n", buf);
 	Fi(tl, 0, "\tVRT_re_init(&%s, ",buf);
 	EncToken(tl->fi, re);
@@ -327,16 +301,16 @@
 		break;
 	case T_EQ:
 	case T_NEQ:
-		Fc(tl, 1, "%sstrcmp(%s, ",
+		Fb(tl, 1, "%sstrcmp(%s, ",
 		    tl->t->tok == T_EQ ? "!" : "", vp->rname);
 		vcc_NextToken(tl);
 		ExpectErr(tl, CSTR);
-		EncToken(tl->fc, tl->t);
-		Fc(tl, 0, ")\n");
+		EncToken(tl->fb, tl->t);
+		Fb(tl, 0, ")\n");
 		vcc_NextToken(tl);
 		break;
 	default:
-		Fc(tl, 1, "%s != (void*)0", vp->rname);
+		Fb(tl, 1, "%s != (void*)0\n", vp->rname);
 		break;
 	}
 }
@@ -345,7 +319,7 @@
 Cond_Int(struct var *vp, struct tokenlist *tl)
 {
 
-	Fc(tl, 1, "%s ", vp->rname);
+	Fb(tl, 1, "%s ", vp->rname);
 	switch (tl->t->tok) {
 	case T_EQ:
 	case T_NEQ:
@@ -353,7 +327,7 @@
 	case T_GEQ:
 	case '>':
 	case '<':
-		Fc(tl, 0, "%.*s ", PF(tl->t));
+		Fb(tl, 0, "%.*s ", PF(tl->t));
 		vcc_NextToken(tl);
 		switch(vp->fmt) {
 		case TIME:
@@ -361,7 +335,7 @@
 			break;
 		case INT:
 			ExpectErr(tl, CNUM);
-			Fc(tl, 0, "%.*s ", PF(tl->t));
+			Fb(tl, 0, "%.*s ", PF(tl->t));
 			vcc_NextToken(tl);
 			break;
 		case SIZE:
@@ -374,7 +348,7 @@
 			vcc_ErrWhere(tl, tl->t);
 			return;
 		}
-		Fc(tl, 0, "\n");
+		Fb(tl, 0, "\n");
 		break;
 	default:
 		vsb_printf(tl->sb, "Illegal condition ");
@@ -391,14 +365,14 @@
 Cond_Bool(struct var *vp, struct tokenlist *tl)
 {
 
-	Fc(tl, 1, "%s\n", vp->rname);
+	Fb(tl, 1, "%s\n", vp->rname);
 }
 
 static void
 Cond_Backend(struct var *vp, struct tokenlist *tl)
 {
 
-	Fc(tl, 1, "%s\n", vp->rname);
+	Fb(tl, 1, "%s\n", vp->rname);
 }
 
 static void
@@ -408,10 +382,10 @@
 
 	C(tl, ",");
 	if (tl->t->tok == '!') {
-		Fc(tl, 1, "!(\n");
+		Fb(tl, 1, "!(\n");
 		vcc_NextToken(tl);
 	} else {
-		Fc(tl, 1, "(\n");
+		Fb(tl, 1, "(\n");
 	}
 	if (tl->t->tok == '(') {
 		vcc_NextToken(tl);
@@ -448,35 +422,35 @@
 		vcc_ErrWhere(tl, tl->t);
 		return;
 	}
-	Fc(tl, 1, ")\n");
+	Fb(tl, 1, ")\n");
 }
 
 static void
 Cond_1(struct tokenlist *tl)
 {
 
-	Fc(tl, 1, "(\n");
+	Fb(tl, 1, "(\n");
 	L(tl, Cond_2(tl));
 	while (tl->t->tok == T_CAND) {
 		vcc_NextToken(tl);
-		Fc(tl, 1, ") && (\n");
+		Fb(tl, 1, ") && (\n");
 		L(tl, Cond_2(tl));
 	}
-	Fc(tl, 1, ")\n");
+	Fb(tl, 1, ")\n");
 }
 
 static void
 Cond_0(struct tokenlist *tl)
 {
 
-	Fc(tl, 1, "(\n");
+	Fb(tl, 1, "(\n");
 	L(tl, Cond_1(tl));
 	while (tl->t->tok == T_COR) {
 		vcc_NextToken(tl);
-		Fc(tl, 1, ") || (\n");
+		Fb(tl, 1, ") || (\n");
 		L(tl, Cond_1(tl));
 	}
-	Fc(tl, 1, ")\n");
+	Fb(tl, 1, ")\n");
 }
 
 static void
@@ -485,10 +459,10 @@
 
 	ExpectErr(tl, '(');
 	vcc_NextToken(tl);
-	Fc(tl, 1, "(\n");
+	Fb(tl, 1, "(\n");
 	L(tl, Cond_0(tl));
 	ERRCHK(tl);
-	Fc(tl, 1, ")\n");
+	Fb(tl, 1, ")\n");
 	ExpectErr(tl, ')');
 	vcc_NextToken(tl);
 }
@@ -500,7 +474,7 @@
 {
 
 	ExpectErr(tl, T_IF);
-	Fc(tl, 1, "if \n");
+	Fb(tl, 1, "if \n");
 	vcc_NextToken(tl);
 	L(tl, Conditional(tl));
 	ERRCHK(tl);
@@ -511,7 +485,7 @@
 		case T_ELSE:
 			vcc_NextToken(tl);
 			if (tl->t->tok != T_IF) {
-				Fc(tl, 1, "else \n");
+				Fb(tl, 1, "else \n");
 				L(tl, Compound(tl));
 				ERRCHK(tl);
 				return;
@@ -519,7 +493,7 @@
 			/* FALLTHROUGH */
 		case T_ELSEIF:
 		case T_ELSIF:
-			Fc(tl, 1, "else if \n");
+			Fb(tl, 1, "else if \n");
 			vcc_NextToken(tl);
 			L(tl, Conditional(tl));
 			ERRCHK(tl);
@@ -546,13 +520,13 @@
 	vcc_NextToken(tl);
 	switch (at->tok) {
 	case T_NO_NEW_CACHE:
-		Fc(tl, 1, "VCL_no_new_cache(sp);\n");
+		Fb(tl, 1, "VCL_no_new_cache(sp);\n");
 		return;
 	case T_NO_CACHE:
-		Fc(tl, 1, "VCL_no_cache(sp);\n");
+		Fb(tl, 1, "VCL_no_cache(sp);\n");
 		return;
 #define VCL_RET_MAC(a,b,c,d) case T_##b: \
-		Fc(tl, 1, "VRT_done(sp, VCL_RET_%s);\n", #b); \
+		Fb(tl, 1, "VRT_done(sp, VCL_RET_%s);\n", #b); \
 		tl->curproc->returns |= VCL_RET_##b; \
 		tl->curproc->returnt[d] = at; \
 		return;
@@ -563,35 +537,35 @@
 			a = UintVal(tl);
 		else
 			a = 0;
-		Fc(tl, 1, "VRT_error(sp, %u", a);
+		Fb(tl, 1, "VRT_error(sp, %u", a);
 		if (tl->t->tok == CSTR) {
-			Fc(tl, 0, ", %.*s", PF(tl->t));
+			Fb(tl, 0, ", %.*s", PF(tl->t));
 			vcc_NextToken(tl);
 		} else {
-			Fc(tl, 0, ", (const char *)0");
+			Fb(tl, 0, ", (const char *)0");
 		}
-		Fc(tl, 0, ");\n");
-		Fc(tl, 1, "VRT_done(sp, VCL_RET_ERROR);\n");
+		Fb(tl, 0, ");\n");
+		Fb(tl, 1, "VRT_done(sp, VCL_RET_ERROR);\n");
 		return;
 	case T_SWITCH_CONFIG:
 		ExpectErr(tl, ID);
-		Fc(tl, 1, "VCL_switch_config(\"%.*s\");\n", PF(tl->t));
+		Fb(tl, 1, "VCL_switch_config(\"%.*s\");\n", PF(tl->t));
 		vcc_NextToken(tl);
 		return;
 	case T_CALL:
 		ExpectErr(tl, ID);
 		AddCall(tl, tl->t);
 		AddRef(tl, tl->t, R_FUNC);
-		Fc(tl, 1, "if (VGC_function_%.*s(sp))\n", PF(tl->t));
-		Fc(tl, 1, "\treturn (1);\n");
+		Fb(tl, 1, "if (VGC_function_%.*s(sp))\n", PF(tl->t));
+		Fb(tl, 1, "\treturn (1);\n");
 		vcc_NextToken(tl);
 		return;
 	case T_REWRITE:
 		ExpectErr(tl, CSTR);
-		Fc(tl, 1, "VCL_rewrite(%.*s", PF(tl->t));
+		Fb(tl, 1, "VCL_rewrite(%.*s", PF(tl->t));
 		vcc_NextToken(tl);
 		ExpectErr(tl, CSTR);
-		Fc(tl, 0, ", %.*s);\n", PF(tl->t));
+		Fb(tl, 0, ", %.*s);\n", PF(tl->t));
 		vcc_NextToken(tl);
 		return;
 	case T_SET:
@@ -599,7 +573,7 @@
 		vp = FindVar(tl, tl->t, vcc_vars);
 		ERRCHK(tl);
 		assert(vp != NULL);
-		Fc(tl, 1, "%s", vp->lname);
+		Fb(tl, 1, "%s", vp->lname);
 		vcc_NextToken(tl);
 		switch (vp->fmt) {
 		case INT:
@@ -608,11 +582,11 @@
 		case TIME:
 		case FLOAT:
 			if (tl->t->tok != '=')
-				Fc(tl, 0, "%s %c ", vp->rname, *tl->t->b);
+				Fb(tl, 0, "%s %c ", vp->rname, *tl->t->b);
 			a = tl->t->tok;
 			vcc_NextToken(tl);
 			if (a == T_MUL || a == T_DIV)
-				Fc(tl, 0, "%g", DoubleVal(tl));
+				Fb(tl, 0, "%g", DoubleVal(tl));
 			else if (vp->fmt == TIME)
 				TimeVal(tl);
 			else if (vp->fmt == SIZE)
@@ -620,15 +594,15 @@
 			else if (vp->fmt == RATE)
 				RateVal(tl);
 			else
-				Fc(tl, 0, "%g", DoubleVal(tl));
-			Fc(tl, 0, ");\n");
+				Fb(tl, 0, "%g", DoubleVal(tl));
+			Fb(tl, 0, ");\n");
 			break;
 #if 0	/* XXX: enable if we find a legit use */
 		case IP:
 			if (tl->t->tok == '=') {
 				vcc_NextToken(tl);
 				u = vcc_IpVal(tl);
-				Fc(tl, 0, "= %uU; /* %u.%u.%u.%u */\n",
+				Fb(tl, 0, "= %uU; /* %u.%u.%u.%u */\n",
 				    u,
 				    (u >> 24) & 0xff,
 				    (u >> 16) & 0xff,
@@ -647,9 +621,9 @@
 			if (tl->t->tok == '=') {
 				vcc_NextToken(tl);
 				AddRef(tl, tl->t, R_BACKEND);
-				Fc(tl, 0, "VGC_backend_%.*s", PF(tl->t));
+				Fb(tl, 0, "VGC_backend_%.*s", PF(tl->t));
 				vcc_NextToken(tl);
-				Fc(tl, 0, ");\n");
+				Fb(tl, 0, ");\n");
 				break;
 			}
 			vsb_printf(tl->sb, "Illegal assignment operator ");
@@ -679,7 +653,7 @@
 {
 
 	ExpectErr(tl, '{');
-	Fc(tl, 1, "{\n");
+	Fb(tl, 1, "{\n");
 	tl->indent += INDENT;
 	C(tl, ";");
 	vcc_NextToken(tl);
@@ -695,7 +669,7 @@
 		case '}':
 			vcc_NextToken(tl);
 			tl->indent -= INDENT;
-			Fc(tl, 1, "}\n");
+			Fb(tl, 1, "}\n");
 			return;
 		case EOI:
 			vsb_printf(tl->sb,
@@ -853,28 +827,40 @@
 static void
 Function(struct tokenlist *tl)
 {
-	struct token *tn;
+	int m;
 
 	vcc_NextToken(tl);
 	ExpectErr(tl, ID);
-	tl->curproc = AddProc(tl, tl->t, 1);
-	tl->curproc->exists++;
-	tn = tl->t;
-	AddDef(tl, tl->t, R_FUNC);
-	Fh(tl, 0, "static int VGC_function_%.*s (struct sess *sp);\n",
-	    PF(tl->t));
-	Fc(tl, 1, "static int\n");
-	Fc(tl, 1, "VGC_function_%.*s (struct sess *sp)\n", PF(tl->t));
+
+	m = IsMethod(tl->t);
+	if (m != -1) {
+		assert(m < N_METHODS);
+		tl->fb = tl->fm[m];
+		if (tl->mprocs[m] == NULL) {
+			tl->mprocs[m] = AddProc(tl, tl->t, 1);
+			tl->mprocs[m]->exists++;
+			AddDef(tl, tl->t, R_FUNC);
+			AddRef(tl, tl->t, R_FUNC);
+		}
+		tl->curproc = tl->mprocs[m];
+	} else {
+		tl->fb = tl->fc;
+		tl->curproc = AddProc(tl, tl->t, 1);
+		tl->curproc->exists++;
+		AddDef(tl, tl->t, R_FUNC);
+		Fh(tl, 0, "static int VGC_function_%.*s (struct sess *sp);\n",
+		    PF(tl->t));
+		Fc(tl, 1, "static int\n");
+		Fc(tl, 1, "VGC_function_%.*s (struct sess *sp)\n", PF(tl->t));
+	}
 	vcc_NextToken(tl);
 	tl->indent += INDENT;
-	Fc(tl, 1, "{\n");
+	Fb(tl, 1, "{\n");
 	L(tl, Compound(tl));
-	if (IsMethod(tn) == 1) {
-		Fc(tl, 1, "VGC_function_default_%.*s(sp);\n", PF(tn));
-	}
-	Fc(tl, 1, "}\n");
+	Fb(tl, 1, "}\n");
 	tl->indent -= INDENT;
-	Fc(tl, 0, "\n");
+	Fb(tl, 0, "\n");
+	tl->fb = NULL;
 }
 
 /*--------------------------------------------------------------------




More information about the varnish-commit mailing list