summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--args.h17
-rw-r--r--eval.c23
-rw-r--r--hash.c3
-rw-r--r--lib.c84
-rw-r--r--match.c6
-rw-r--r--stream.c3
-rw-r--r--syslog.c3
7 files changed, 55 insertions, 84 deletions
diff --git a/args.h b/args.h
index a9174699..efd49d61 100644
--- a/args.h
+++ b/args.h
@@ -40,18 +40,29 @@ typedef int arg_index;
(coerce(struct args *, \
alloca(offsetof(struct args, arg) + (N)*sizeof (val))))
-INLINE void args_init_list(struct args *args, cnum argc, val list)
+INLINE struct args *args_init_list(struct args *args, cnum argc, val list)
{
args->argc = argc;
args->fill = 0;
args->list = list;
+ return args;
}
-INLINE void args_init(struct args *args, cnum argc)
+INLINE struct args *args_init(struct args *args, cnum argc)
{
- args_init_list(args, argc, nil);
+ return args_init_list(args, argc, nil);
}
+#define args_decl_list(NAME, N, L) \
+ mem_t *NAME ## _mem = \
+ coerce(mem_t *, \
+ alloca(offsetof(struct args, arg) + (N)*sizeof (val))); \
+ struct args *NAME = args_init_list(coerce(struct args *, \
+ NAME ## _mem), N, L)
+
+#define args_decl(NAME, N) args_decl_list(NAME, N, nil)
+
+
INLINE val args_add(struct args *args, val arg)
{
return args->arg[args->fill++] = arg;
diff --git a/eval.c b/eval.c
index c792e99e..0c5ed46b 100644
--- a/eval.c
+++ b/eval.c
@@ -670,7 +670,7 @@ static val get_param_syms(val params)
val apply(val fun, val arglist, val ctx_form)
{
- struct args *args = args_alloc(ARGS_MAX);
+ args_decl(args, ARGS_MAX);
args_init_list(args, ARGS_MAX, arglist);
return generic_funcall(fun, args);
}
@@ -990,9 +990,7 @@ static val do_eval(val form, val env, val ctx_form,
cnum alen = if3(consp(arglist), c_num(length(arglist)), 0);
cnum argc = max(alen, ARGS_MAX);
val ret, lfe_save = last_form_evaled;
- struct args *args = args_alloc(argc);
-
- args_init(args, argc);
+ args_decl(args, argc);
do_eval_args(rest(form), env, form, &lookup_var, args);
@@ -1424,8 +1422,8 @@ static val expand_macro(val form, val expander, val menv)
val saved_de = set_dyn_env(make_env(nil, nil, dyn_env));
val exp_env = bind_macro_params(env, menv, params, arglist, nil, form);
val result;
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, arglist);
+ args_decl_list(args, ARGS_MIN, arglist);
+
debug_frame(name, args, nil, env, nil, nil, nil);
result = eval_progn(body, exp_env, body);
debug_end;
@@ -1841,8 +1839,7 @@ static val op_dwim(val form, val env)
val objexpr = pop(&argexps);
cnum alen = if3(consp(argexps), c_num(length(argexps)), 0);
cnum argc = max(alen, ARGS_MIN);
- struct args *args = args_alloc(argc);
- args_init(args, argc);
+ args_decl(args, argc);
if (!consp(cdr(form)))
eval_error(form, lit("~s: missing argument"), car(form), nao);
@@ -1865,12 +1862,10 @@ static val op_catch(val form, val env)
result = eval(try_form, env, try_form);
uw_catch(exsym, exvals) {
- struct args *args = args_alloc(ARGS_MIN);
+ args_decl_list(args, ARGS_MIN, exvals);
val catches = rest(rest(rest(form)));
val iter;
- args_init_list(args, ARGS_MIN, exvals);
-
for (iter = catches; iter; iter = cdr(iter)) {
val clause = car(iter);
val type = first(clause);
@@ -3286,8 +3281,7 @@ val mapcarv(val fun, struct args *lists)
val mapcarl(val fun, val list_of_lists)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, list_of_lists);
+ args_decl_list(args, ARGS_MIN, list_of_lists);
return mapcarv(fun, args);
}
@@ -3377,8 +3371,7 @@ static val lazy_mapcarv(val fun, struct args *lists)
static val lazy_mapcarl(val fun, val list_of_lists)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, list_of_lists);
+ args_decl_list(args, ARGS_MIN, list_of_lists);
return lazy_mapcarv(fun, args);
}
diff --git a/hash.c b/hash.c
index 49bdf97b..33455f36 100644
--- a/hash.c
+++ b/hash.c
@@ -886,8 +886,7 @@ val hashv(struct args *args)
val hashl(val arglist)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, arglist);
+ args_decl_list(args, ARGS_MIN, arglist);
return hashv(args);
}
diff --git a/lib.c b/lib.c
index 27b77808..b8000fe0 100644
--- a/lib.c
+++ b/lib.c
@@ -1022,8 +1022,7 @@ val lazy_appendv(struct args *args)
val lazy_appendl(val lists)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, lists);
+ args_decl_list(args, ARGS_MIN, lists);
return lazy_appendv(args);
}
@@ -2320,15 +2319,13 @@ val minv(val first, struct args *rest)
val maxl(val first, val rest)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, rest);
+ args_decl_list(args, ARGS_MIN, rest);
return maxv(first, args);
}
val minl(val first, val rest)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, rest);
+ args_decl_list(args, ARGS_MIN, rest);
return minv(first, args);
}
@@ -4389,11 +4386,13 @@ val generic_funcall(val fun, struct args *args_in)
val *arg = 0;
if (args->argc < fixparam) {
- args = args_alloc(fixparam);
- args_init(args, fixparam);
- args_copy_zap(args, args_in);
+ args_decl(args_copy, fixparam);
+ args_copy_zap(args_copy, args_in);
+ args = args_copy;
}
+ arg = args->arg;
+
args_normalize_fill(args, reqargs, fixparam);
if (args->fill < reqargs)
@@ -4402,8 +4401,6 @@ val generic_funcall(val fun, struct args *args_in)
if (args->list)
callerror(fun, lit("too many arguments"));
- arg = args->arg;
-
switch (fun->f.functype) {
case F0:
return fun->f.f.f0(fun->f.env);
@@ -4438,17 +4435,18 @@ val generic_funcall(val fun, struct args *args_in)
val *arg = 0;
if (args->argc < fixparam) {
- args = args_alloc(fixparam);
- args_init(args, fixparam);
- args_copy_zap(args, args_in);
+ args_decl(args_copy, fixparam);
+ args_copy_zap(args_copy, args_in);
+ args = args_copy;
}
+ arg = args->arg;
+
args_normalize_fill(args, reqargs, fixparam);
if (args->fill < reqargs)
callerror(fun, lit("missing required arguments"));
- arg = args->arg;
args_clear(args);
switch (fun->f.functype) {
@@ -4493,17 +4491,13 @@ static noreturn void wrongargs(val fun)
val funcall(val fun)
{
- struct args *args;
-
if (type(fun) != FUN || fun->f.optargs) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
return generic_funcall(fun, args);
}
if (fun->f.variadic) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -4530,18 +4524,14 @@ val funcall(val fun)
val funcall1(val fun, val arg)
{
- struct args *args;
-
if (type(fun) != FUN || fun->f.optargs) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
args_add(args, arg);
return generic_funcall(fun, args);
}
if (fun->f.variadic) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -4575,18 +4565,14 @@ val funcall1(val fun, val arg)
val funcall2(val fun, val arg1, val arg2)
{
- struct args *args;
-
if (type(fun) != FUN || fun->f.optargs) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
args_add2(args, arg1, arg2);
return generic_funcall(fun, args);
}
if (fun->f.variadic) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -4626,18 +4612,14 @@ val funcall2(val fun, val arg1, val arg2)
val funcall3(val fun, val arg1, val arg2, val arg3)
{
- struct args *args;
-
if (type(fun) != FUN || fun->f.optargs) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
args_add3(args, arg1, arg2, arg3);
return generic_funcall(fun, args);
}
if (fun->f.variadic) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -4683,18 +4665,14 @@ val funcall3(val fun, val arg1, val arg2, val arg3)
val funcall4(val fun, val arg1, val arg2, val arg3, val arg4)
{
- struct args *args;
-
if (type(fun) != FUN || fun->f.optargs) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
args_add4(args, arg1, arg2, arg3, arg4);
return generic_funcall(fun, args);
}
if (fun->f.variadic) {
- args = args_alloc(ARGS_MIN);
- args_init(args, ARGS_MIN);
+ args_decl(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -4901,8 +4879,7 @@ val transposev(struct args *list)
val transpose(val list)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, list);
+ args_decl_list(args, ARGS_MIN, list);
return make_like(transposev(args), list);
}
@@ -4983,11 +4960,10 @@ val juxtv(struct args *funlist)
static val do_and(val fun1_list, struct args *args_in)
{
cnum argc = args_in->argc;
- struct args *args = args_alloc(argc);
+ args_decl(args, argc);
val ret = t;
fun1_list = nullify(fun1_list);
- args_init(args, argc);
for (; fun1_list; fun1_list = cdr(fun1_list)) {
args_copy(args, args_in);
@@ -5035,11 +5011,10 @@ val swap_12_21(val fun)
static val do_or(val fun1_list, struct args *args_in)
{
cnum argc = args_in->argc;
- struct args *args = args_alloc(argc);
+ args_decl(args, argc);
val ret = nil;
fun1_list = nullify(fun1_list);
- args_init(args, argc);
for (; fun1_list; fun1_list = cdr(fun1_list)) {
args_copy(args, args_in);
@@ -5088,10 +5063,8 @@ static val do_iff(val env, struct args *args_in)
{
cons_bind (condfun, choices, env);
cons_bind (thenfun, elsefun, choices);
- cnum argc = args_in->argc;
- struct args *args = args_alloc(argc);
+ args_decl(args, args_in->argc);
- args_init(args, argc);
args_copy(args, args_in);
return if3(generic_funcall(condfun, args_in),
@@ -6292,8 +6265,7 @@ val unique(val seq, val keyfun, struct args *hashv_args)
val uniq(val seq)
{
- struct args *hashv_args = args_alloc(1);
- args_init(hashv_args, 1);
+ args_decl(hashv_args, ARGS_MIN);
args_add(hashv_args, equal_based_k);
return unique(seq, identity_f, hashv_args);
}
diff --git a/match.c b/match.c
index 4c08fbc6..62eeb50d 100644
--- a/match.c
+++ b/match.c
@@ -1101,8 +1101,7 @@ static val h_fun(match_line_ctx *c)
}
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, bindings_cp);
+ args_decl_list(args, ARGS_MIN, bindings_cp);
uw_block_begin(nil, result);
uw_env_begin;
debug_frame(sym, args, ub_p_a_pairs, c->bindings, c->dataline, c->data_lineno, c->pos);
@@ -3589,8 +3588,7 @@ static val v_fun(match_files_ctx *c)
}
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, bindings_cp);
+ args_decl_list(args, ARGS_MIN, bindings_cp);
uw_block_begin(nil, result);
uw_env_begin;
debug_frame(sym, args, ub_p_a_pairs, c->bindings, if2(consp(c->data), car(c->data)),
diff --git a/stream.c b/stream.c
index 1efc58b6..cde7e5b8 100644
--- a/stream.c
+++ b/stream.c
@@ -2517,9 +2517,8 @@ val formatv(val stream_in, val fmtstr, struct args *al)
val vformat(val stream, val fmtstr, va_list vl)
{
- struct args *args = args_alloc(ARGS_MAX);
val arg;
- args_init(args, ARGS_MAX);
+ args_decl(args, ARGS_MAX);
while ((arg = va_arg(vl, val)) != nao)
args_add_checked(lit("format"), args, arg);
diff --git a/syslog.c b/syslog.c
index 563c0220..8c7b81ef 100644
--- a/syslog.c
+++ b/syslog.c
@@ -122,8 +122,7 @@ val syslog_wrapv(val prio, val fmt, struct args *args)
val syslog_wrap(val prio, val fmt, val arglist)
{
- struct args *args = args_alloc(ARGS_MIN);
- args_init_list(args, ARGS_MIN, arglist);
+ args_decl_list(args, ARGS_MIN, arglist);
return syslog_wrapv(prio, fmt, args);
}