Commit 2ba2cc34 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Align handling of STRINGS derived types.

Fixes:	#2745
parent da700bf1
......@@ -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
......
......@@ -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];
......
......@@ -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,
......
......@@ -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] = {{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment