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 { ...@@ -322,7 +322,10 @@ varnish v1 -vcl+backend {
} }
varnish v1 -vcl+backend { varnish v1 -vcl+backend {
import debug;
sub vcl_deliver { sub vcl_deliver {
// Ticket 2745
debug.sethdr(resp.http.rst, req.restarts);
set resp.http.foo = set resp.http.foo =
(resp.http.foo + resp.http.bar) == ("X" + resp.http.foo); (resp.http.foo + resp.http.bar) == ("X" + resp.http.foo);
} }
...@@ -335,6 +338,7 @@ varnish v1 -vcl+backend { ...@@ -335,6 +338,7 @@ varnish v1 -vcl+backend {
client c1 { client c1 {
txreq txreq
rxresp rxresp
expect resp.http.rst == "0"
expect resp.http.foo == "true" expect resp.http.foo == "true"
expect resp.http.p == 9223372036854775807 expect resp.http.p == 9223372036854775807
expect resp.http.n == -9223372036854775807 expect resp.http.n == -9223372036854775807
......
...@@ -103,6 +103,7 @@ struct type { ...@@ -103,6 +103,7 @@ struct type {
const char *name; const char *name;
const char *tostring; const char *tostring;
vcc_type_t multype; vcc_type_t multype;
int stringform;
}; };
#define VCC_TYPE(foo) extern const struct type foo[1]; #define VCC_TYPE(foo) extern const struct type foo[1];
......
...@@ -73,7 +73,7 @@ vcc_islit(const struct expr *e) ...@@ -73,7 +73,7 @@ vcc_islit(const struct expr *e)
static const char * static const char *
vcc_utype(vcc_type_t t) vcc_utype(vcc_type_t t)
{ {
if (t == STRINGS || t == STRING_LIST) if (t == STRINGS || t->stringform)
t = STRING; t = STRING;
return (t->name); return (t->name);
} }
...@@ -278,7 +278,7 @@ vcc_expr_tostring(struct vcc *tl, struct expr **e, vcc_type_t fmt) ...@@ -278,7 +278,7 @@ vcc_expr_tostring(struct vcc *tl, struct expr **e, vcc_type_t fmt)
uint8_t constant = EXPR_VAR; uint8_t constant = EXPR_VAR;
CHECK_OBJ_NOTNULL(*e, EXPR_MAGIC); CHECK_OBJ_NOTNULL(*e, EXPR_MAGIC);
assert(fmt == STRINGS || fmt == STRING_LIST || fmt == STRING); assert(fmt == STRINGS || fmt->stringform);
assert(fmt != (*e)->fmt); assert(fmt != (*e)->fmt);
p = (*e)->fmt->tostring; p = (*e)->fmt->tostring;
...@@ -361,6 +361,7 @@ vcc_Eval_Handle(struct vcc *tl, struct expr **e, struct token *t, ...@@ -361,6 +361,7 @@ vcc_Eval_Handle(struct vcc *tl, struct expr **e, struct token *t,
(void)t; (void)t;
(void)tl; (void)tl;
AN(sym->rname); AN(sym->rname);
AZ(type->stringform);
if (sym->type != STRING && type == STRINGS) { if (sym->type != STRING && type == STRINGS) {
*e = vcc_mk_expr(STRINGS, "\"%s\"", sym->name); *e = vcc_mk_expr(STRINGS, "\"%s\"", sym->name);
...@@ -1274,22 +1275,26 @@ vcc_expr0(struct vcc *tl, struct expr **e, vcc_type_t fmt) ...@@ -1274,22 +1275,26 @@ vcc_expr0(struct vcc *tl, struct expr **e, vcc_type_t fmt)
assert(fmt != STRINGS); assert(fmt != STRINGS);
*e = NULL; *e = NULL;
t1 = tl->t; t1 = tl->t;
if (fmt == STRING_LIST || fmt == STRING) if (fmt->stringform)
vcc_expr_cor(tl, e, STRINGS); vcc_expr_cor(tl, e, STRINGS);
else else
vcc_expr_cor(tl, e, fmt); vcc_expr_cor(tl, e, fmt);
ERRCHK(tl); ERRCHK(tl);
assert((*e)->fmt != STRING_LIST && (*e)->fmt != STRING); assert(!(*e)->fmt->stringform);
if ((*e)->fmt == STRINGS && fmt == STRING_LIST) if ((*e)->fmt != STRINGS && fmt->stringform)
(*e)->fmt = STRING_LIST; vcc_expr_tostring(tl, e, STRINGS);
else if ((*e)->fmt == STRINGS && fmt == STRING)
*e = vcc_expr_edit(tl, STRING, "\vS", *e, NULL); if ((*e)->fmt == STRINGS && fmt->stringform) {
else if ((*e)->fmt == STRINGS && fmt == STRANDS) { if (fmt == STRING_LIST)
*e = vcc_expr_edit(tl, STRANDS, "\vT", (*e), NULL); (*e)->fmt = STRING_LIST;
} else if ((*e)->fmt != STRINGS && else if (fmt == STRING)
(fmt == STRING || fmt == STRING_LIST)) *e = vcc_expr_edit(tl, STRING, "\vS", *e, NULL);
vcc_expr_tostring(tl, e, fmt); else if (fmt == STRANDS)
*e = vcc_expr_edit(tl, STRANDS, "\vT", (*e), NULL);
else
WRONG("Unhandled stringform");
}
if ((*e)->fmt == STRING_LIST) if ((*e)->fmt == STRING_LIST)
*e = vcc_expr_edit(tl, STRING_LIST, *e = vcc_expr_edit(tl, STRING_LIST,
......
...@@ -131,11 +131,13 @@ const struct type STEVEDORE[1] = {{ ...@@ -131,11 +131,13 @@ const struct type STEVEDORE[1] = {{
const struct type STRING[1] = {{ const struct type STRING[1] = {{
.magic = TYPE_MAGIC, .magic = TYPE_MAGIC,
.name = "STRING", .name = "STRING",
.stringform = 1,
}}; }};
const struct type STRANDS[1] = {{ const struct type STRANDS[1] = {{
.magic = TYPE_MAGIC, .magic = TYPE_MAGIC,
.name = "STRANDS", .name = "STRANDS",
.stringform = 1,
}}; }};
const struct type STRINGS[1] = {{ const struct type STRINGS[1] = {{
...@@ -147,6 +149,7 @@ const struct type STRINGS[1] = {{ ...@@ -147,6 +149,7 @@ const struct type STRINGS[1] = {{
const struct type STRING_LIST[1] = {{ const struct type STRING_LIST[1] = {{
.magic = TYPE_MAGIC, .magic = TYPE_MAGIC,
.name = "STRING_LIST", .name = "STRING_LIST",
.stringform = 1,
}}; }};
const struct type SUB[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