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