[master] 2ba2cc341 Align handling of STRINGS derived types.
Poul-Henning Kamp
phk at FreeBSD.org
Wed Aug 22 06:54:14 UTC 2018
commit 2ba2cc341f06d732abed554fc23aa6934e3b9950
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Aug 22 06:52:48 2018 +0000
Align handling of STRINGS derived types.
Fixes: #2745
diff --git a/bin/varnishtest/tests/v00020.vtc b/bin/varnishtest/tests/v00020.vtc
index 4bebb20ae..f269c4d50 100644
--- a/bin/varnishtest/tests/v00020.vtc
+++ b/bin/varnishtest/tests/v00020.vtc
@@ -322,7 +322,10 @@ varnish v1 -vcl+backend {
}
varnish v1 -vcl+backend {
+ import debug;
sub vcl_deliver {
+ // Ticket 2745
+ debug.sethdr(resp.http.rst, req.restarts);
set resp.http.foo =
(resp.http.foo + resp.http.bar) == ("X" + resp.http.foo);
}
@@ -335,6 +338,7 @@ varnish v1 -vcl+backend {
client c1 {
txreq
rxresp
+ expect resp.http.rst == "0"
expect resp.http.foo == "true"
expect resp.http.p == 9223372036854775807
expect resp.http.n == -9223372036854775807
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 3a6860abe..01f2d92c0 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -103,6 +103,7 @@ struct type {
const char *name;
const char *tostring;
vcc_type_t multype;
+ int stringform;
};
#define VCC_TYPE(foo) extern const struct type foo[1];
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index b420dedf8..4bc8ea5d9 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -73,7 +73,7 @@ vcc_islit(const struct expr *e)
static const char *
vcc_utype(vcc_type_t t)
{
- if (t == STRINGS || t == STRING_LIST)
+ if (t == STRINGS || t->stringform)
t = STRING;
return (t->name);
}
@@ -278,7 +278,7 @@ vcc_expr_tostring(struct vcc *tl, struct expr **e, vcc_type_t fmt)
uint8_t constant = EXPR_VAR;
CHECK_OBJ_NOTNULL(*e, EXPR_MAGIC);
- assert(fmt == STRINGS || fmt == STRING_LIST || fmt == STRING);
+ assert(fmt == STRINGS || fmt->stringform);
assert(fmt != (*e)->fmt);
p = (*e)->fmt->tostring;
@@ -361,6 +361,7 @@ vcc_Eval_Handle(struct vcc *tl, struct expr **e, struct token *t,
(void)t;
(void)tl;
AN(sym->rname);
+ AZ(type->stringform);
if (sym->type != STRING && type == STRINGS) {
*e = vcc_mk_expr(STRINGS, "\"%s\"", sym->name);
@@ -1274,22 +1275,26 @@ vcc_expr0(struct vcc *tl, struct expr **e, vcc_type_t fmt)
assert(fmt != STRINGS);
*e = NULL;
t1 = tl->t;
- if (fmt == STRING_LIST || fmt == STRING)
+ if (fmt->stringform)
vcc_expr_cor(tl, e, STRINGS);
else
vcc_expr_cor(tl, e, fmt);
ERRCHK(tl);
- assert((*e)->fmt != STRING_LIST && (*e)->fmt != STRING);
-
- if ((*e)->fmt == STRINGS && fmt == STRING_LIST)
- (*e)->fmt = STRING_LIST;
- else if ((*e)->fmt == STRINGS && fmt == STRING)
- *e = vcc_expr_edit(tl, STRING, "\vS", *e, NULL);
- else if ((*e)->fmt == STRINGS && fmt == STRANDS) {
- *e = vcc_expr_edit(tl, STRANDS, "\vT", (*e), NULL);
- } else if ((*e)->fmt != STRINGS &&
- (fmt == STRING || fmt == STRING_LIST))
- vcc_expr_tostring(tl, e, fmt);
+ assert(!(*e)->fmt->stringform);
+
+ if ((*e)->fmt != STRINGS && fmt->stringform)
+ vcc_expr_tostring(tl, e, STRINGS);
+
+ if ((*e)->fmt == STRINGS && fmt->stringform) {
+ if (fmt == STRING_LIST)
+ (*e)->fmt = STRING_LIST;
+ else if (fmt == STRING)
+ *e = vcc_expr_edit(tl, STRING, "\vS", *e, NULL);
+ else if (fmt == STRANDS)
+ *e = vcc_expr_edit(tl, STRANDS, "\vT", (*e), NULL);
+ else
+ WRONG("Unhandled stringform");
+ }
if ((*e)->fmt == STRING_LIST)
*e = vcc_expr_edit(tl, STRING_LIST,
diff --git a/lib/libvcc/vcc_types.c b/lib/libvcc/vcc_types.c
index dbeaacb09..2e5660994 100644
--- a/lib/libvcc/vcc_types.c
+++ b/lib/libvcc/vcc_types.c
@@ -131,11 +131,13 @@ const struct type STEVEDORE[1] = {{
const struct type STRING[1] = {{
.magic = TYPE_MAGIC,
.name = "STRING",
+ .stringform = 1,
}};
const struct type STRANDS[1] = {{
.magic = TYPE_MAGIC,
.name = "STRANDS",
+ .stringform = 1,
}};
const struct type STRINGS[1] = {{
@@ -147,6 +149,7 @@ const struct type STRINGS[1] = {{
const struct type STRING_LIST[1] = {{
.magic = TYPE_MAGIC,
.name = "STRING_LIST",
+ .stringform = 1,
}};
const struct type SUB[1] = {{
More information about the varnish-commit
mailing list