Commit 7f805f17 authored by Nils Goroll's avatar Nils Goroll

Use an anonymous struct to pass the argstruct to vmod functions

... to save stack space

Fixes #2643
parent ca1c6d39
...@@ -467,7 +467,6 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv, ...@@ -467,7 +467,6 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv,
const struct vjsn_val *vv, *vvp; const struct vjsn_val *vv, *vvp;
const char *sa; const char *sa;
char ssa[64]; char ssa[64];
char ssa2[64];
int n; int n;
CAST_OBJ_NOTNULL(vv, priv, VJSN_VAL_MAGIC); CAST_OBJ_NOTNULL(vv, priv, VJSN_VAL_MAGIC);
...@@ -481,10 +480,6 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv, ...@@ -481,10 +480,6 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv,
sa = vv->value; sa = vv->value;
if (*sa == '\0') { if (*sa == '\0') {
sa = NULL; sa = NULL;
} else {
bprintf(ssa, "args_%u", tl->unique++);
VSB_printf(tl->curproc->prologue, " %s %s;\n", sa, ssa);
sa = ssa;
} }
vv = VTAILQ_NEXT(vv, list); vv = VTAILQ_NEXT(vv, list);
SkipToken(tl, '('); SkipToken(tl, '(');
...@@ -572,27 +567,28 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv, ...@@ -572,27 +567,28 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv,
} }
if (sa != NULL) if (sa != NULL)
e1 = vcc_mk_expr(rfmt, "%s(ctx%s,\v+(\n", cfunc, extra); e1 = vcc_mk_expr(rfmt, "%s(ctx%s,\v+ &(%s){\n",
cfunc, extra, sa);
else else
e1 = vcc_mk_expr(rfmt, "%s(ctx%s\v+", cfunc, extra); e1 = vcc_mk_expr(rfmt, "%s(ctx%s\v+", cfunc, extra);
n = 0; n = 0;
VTAILQ_FOREACH_SAFE(fa, &head, list, fa2) { VTAILQ_FOREACH_SAFE(fa, &head, list, fa2) {
n++; n++;
if (fa->optional) if (fa->optional) {
VSB_printf(tl->curproc->prologue, bprintf(ssa, "\v1.valid_%s = %d,\n",
" %s.valid_%s = %d;\n", sa, fa->name, fa->avail); fa->name, fa->avail);
e1 = vcc_expr_edit(tl, e1->fmt, ssa, e1, NULL);
}
if (fa->result == NULL && fa->type == ENUM && fa->val != NULL) if (fa->result == NULL && fa->type == ENUM && fa->val != NULL)
vcc_do_enum(tl, fa, strlen(fa->val), fa->val); vcc_do_enum(tl, fa, strlen(fa->val), fa->val);
if (fa->result == NULL && fa->val != NULL) if (fa->result == NULL && fa->val != NULL)
fa->result = vcc_mk_expr(fa->type, "%s", fa->val); fa->result = vcc_mk_expr(fa->type, "%s", fa->val);
if (fa->result != NULL && sa != NULL) { if (fa->result != NULL && sa != NULL) {
if (fa->name && *fa->name != '\0') if (fa->name && *fa->name != '\0')
bprintf(ssa2, "\v1%s.%s = \v2,\n", bprintf(ssa, "\v1.%s = \v2,\n", fa->name);
sa, fa->name);
else else
bprintf(ssa2, "\v1%s.arg%d = \v2,\n", bprintf(ssa, "\v1.arg%d = \v2,\n", n);
sa, n); e1 = vcc_expr_edit(tl, e1->fmt, ssa, e1, fa->result);
e1 = vcc_expr_edit(tl, e1->fmt, ssa2, e1, fa->result);
} else if (fa->result != NULL) { } else if (fa->result != NULL) {
e1 = vcc_expr_edit(tl, e1->fmt, "\v1,\n\v2", e1 = vcc_expr_edit(tl, e1->fmt, "\v1,\n\v2",
e1, fa->result); e1, fa->result);
...@@ -604,8 +600,7 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv, ...@@ -604,8 +600,7 @@ vcc_func(struct vcc *tl, struct expr **e, const void *priv,
free(fa); free(fa);
} }
if (sa != NULL) { if (sa != NULL) {
bprintf(ssa2, "\v1&%s\v-\n))", sa); *e = vcc_expr_edit(tl, e1->fmt, "\v1\n})\v-", e1, NULL);
*e = vcc_expr_edit(tl, e1->fmt, ssa2, e1, NULL);
} else { } else {
*e = vcc_expr_edit(tl, e1->fmt, "\v1\n)\v-", e1, NULL); *e = vcc_expr_edit(tl, e1->fmt, "\v1\n)\v-", e1, NULL);
} }
......
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