[master] ae2f4b0 Keep value string len in vex expression tree.
Martin Blix Grydeland
martin at varnish-cache.org
Tue Oct 1 14:48:17 CEST 2013
commit ae2f4b052288a5deed639ffc8ed9fcb12bbb4087
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date: Wed Sep 18 16:15:44 2013 +0200
Keep value string len in vex expression tree.
This saves a strlen for every string comparison.
diff --git a/lib/libvarnishapi/vsl_query.c b/lib/libvarnishapi/vsl_query.c
index 7932f3c..de6d43b 100644
--- a/lib/libvarnishapi/vsl_query.c
+++ b/lib/libvarnishapi/vsl_query.c
@@ -55,11 +55,14 @@ struct vslq_query {
static int
vslq_test_rec(const struct vex *vex, const struct VSLC_ptr *rec)
{
+ const struct vex_val *val;
int reclen;
const char *recdata;
AN(vex);
AN(rec);
+ val = vex->val;
+ AN(val);
reclen = VSL_LEN(rec->ptr);
recdata = VSL_CDATA(rec->ptr);
@@ -67,13 +70,13 @@ vslq_test_rec(const struct vex *vex, const struct VSLC_ptr *rec)
switch (vex->tok) {
case T_SEQ: /* eq */
assert(vex->val->type == VEX_STRING);
- if (reclen == strlen(vex->val->val_string) &&
+ if (reclen == val->val_stringlen &&
!strncmp(vex->val->val_string, recdata, reclen))
return (1);
return (0);
case T_SNEQ: /* ne */
assert(vex->val->type == VEX_STRING);
- if (reclen != strlen(vex->val->val_string) ||
+ if (reclen != val->val_stringlen ||
strncmp(vex->val->val_string, recdata, reclen))
return (1);
return (0);
diff --git a/lib/libvarnishapi/vxp.h b/lib/libvarnishapi/vxp.h
index 9243e0b..35d1d33 100644
--- a/lib/libvarnishapi/vxp.h
+++ b/lib/libvarnishapi/vxp.h
@@ -100,6 +100,7 @@ struct vex_val {
long long val_int;
double val_float;
char *val_string;
+ size_t val_stringlen;
vre_t *val_regex;
};
diff --git a/lib/libvarnishapi/vxp_parse.c b/lib/libvarnishapi/vxp_parse.c
index 390be8d..7ce5093 100644
--- a/lib/libvarnishapi/vxp_parse.c
+++ b/lib/libvarnishapi/vxp_parse.c
@@ -134,6 +134,7 @@ vxp_expr_str(struct vxp *vxp, struct vex_val **pval)
(*pval)->type = VEX_STRING;
(*pval)->val_string = strdup(vxp->t->dec);
AN((*pval)->val_string);
+ (*pval)->val_stringlen = strlen((*pval)->val_string);
vxp_NextToken(vxp);
}
More information about the varnish-commit
mailing list