r5142 - trunk/varnish-cache/lib/libvcl

phk at varnish-cache.org phk at varnish-cache.org
Fri Aug 27 12:31:55 CEST 2010


Author: phk
Date: 2010-08-27 12:31:55 +0200 (Fri, 27 Aug 2010)
New Revision: 5142

Modified:
   trunk/varnish-cache/lib/libvcl/vcc_expr.c
Log:
Unify the concatenation code STRING and STRING_LIST.

Keep track of constant subexpressions and use it avoid building
multipart constant strings on the workspace, when the C-compiler
will happily build them for us at compile time.



Modified: trunk/varnish-cache/lib/libvcl/vcc_expr.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_expr.c	2010-08-27 09:23:34 UTC (rev 5141)
+++ trunk/varnish-cache/lib/libvcl/vcc_expr.c	2010-08-27 10:31:55 UTC (rev 5142)
@@ -198,7 +198,8 @@
 #define EXPR_MAGIC	0x38c794ab
 	enum var_type	fmt;
 	struct vsb	*vsb;
-	/* XXX: first and last token */
+	uint8_t		constant;
+	struct token	*t1, *t2;
 };
 
 static void vcc_expr0(struct vcc *tl, struct expr **e, enum var_type fmt);
@@ -288,6 +289,16 @@
 	}
 	vsb_finish(e->vsb);
 	AZ(vsb_overflowed(e->vsb));
+	if (e1 != NULL)
+		e->t1 = e1->t1;
+	else if (e2 != NULL)
+		e->t1 = e2->t1;
+	if (e2 != NULL)
+		e->t2 = e2->t1;
+	else if (e1 != NULL)
+		e->t1 = e1->t1;
+	if ((e1 == NULL || e1->constant) && (e2 == NULL || e2->constant))
+		e->constant = 1;
 	vcc_delete_expr(e1);
 	vcc_delete_expr(e2);
 	e->fmt = fmt;
@@ -468,6 +479,8 @@
 		assert(fmt != VOID);
 		EncToken(e1->vsb, tl->t);
 		e1->fmt = STRING;
+		e1->t1 = tl->t;
+		e1->constant = 1;
 		vcc_NextToken(tl);
 		break;
 	case CNUM:
@@ -485,11 +498,13 @@
 			vcc_NextToken(tl);
 			e1->fmt = INT;
 		}
+		e1->constant = 1;
 		break;
 	default:
-		e1->fmt = fmt;
-		vsb_printf(e1->vsb, "<E4 %.*s %u>", PF(tl->t), tl->t->tok);
-		vcc_NextToken(tl);
+		vsb_printf(tl->sb, "Unknown token ");
+		vcc_ErrToken(tl, tl->t);
+		vsb_printf(tl->sb, " when looking for %s\n\n", vcc_Type(fmt));
+		vcc_ErrWhere(tl, tl->t);
 		break;
 	}
 
@@ -553,35 +568,30 @@
 	ERRCHK(tl);
 	f2 = (*e)->fmt;
 
-	if (fmt == STRING_LIST && f2 == STRING) {
-		(*e)->fmt = STRING_LIST;
+	if ((f2 == STRING_LIST || f2 == STRING) && tl->t->tok == '+') {
 		while (tl->t->tok == '+') {
 			vcc_NextToken(tl);
 			vcc_expr_mul(tl, &e2, STRING);
 			if (e2->fmt != STRING && e2->fmt != STRING_LIST)
 				vcc_expr_tostring(&e2, f2);
+				ERRCHK(tl);
 			assert(e2->fmt == STRING || e2->fmt == STRING_LIST);
-			*e = vcc_expr_edit(STRING_LIST, "\v1,\n\v2", *e, e2);
+			if ((*e)->constant &&  e2->constant) {
+				assert((*e)->fmt == STRING);
+				assert(e2->fmt == STRING);
+				*e = vcc_expr_edit(STRING, "\v1\n\v2", *e, e2);
+			} else {
+				*e = vcc_expr_edit(STRING_LIST,
+				    "\v1,\n\v2", *e, e2);
+			}
 		}
-		return;
 	}
+	if (fmt != STRING_LIST && (*e)->fmt == STRING_LIST)
+		*e = vcc_expr_edit(STRING,
+		    "\v+VRT_String(sp,\n\v1,\nvrt_magic_string_end)", *e, NULL);
+	if (fmt == STRING_LIST && (*e)->fmt == STRING)
+		(*e)->fmt = STRING_LIST;
 
-	if (f2 == STRING && tl->t->tok == '+') {
-		*e = vcc_expr_edit(STRING, "\v+VRT_String(sp,\n\v1", *e, NULL);
-		while (tl->t->tok == '+') {
-			vcc_NextToken(tl);
-			vcc_expr_mul(tl, &e2, STRING);
-			if (e2->fmt != STRING && e2->fmt != STRING_LIST)
-				vcc_expr_tostring(&e2, f2);
-
-			assert(e2->fmt == STRING || e2->fmt == STRING_LIST);
-			*e = vcc_expr_edit(STRING, "\v1,\n\v2", *e, e2);
-		}
-		*e = vcc_expr_edit(STRING, "\v1, vrt_magic_string_end)",
-		    *e, NULL);
-		return;
-	}
-
 	switch(f2) {
 	case INT:	break;
 	case TIME:	f2 = DURATION; break;




More information about the varnish-commit mailing list