[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