diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-08-24 22:06:13 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-08-24 22:06:13 -0700 |
commit | 8d78717508e7f49a9af456197369d74352122b91 (patch) | |
tree | c99303cdb7a3678ae97e32c84ff7c842de54b886 | |
parent | ba3809f1be41bec92385b3e023269145dde4e5b2 (diff) | |
download | txr-8d78717508e7f49a9af456197369d74352122b91.tar.gz txr-8d78717508e7f49a9af456197369d74352122b91.tar.bz2 txr-8d78717508e7f49a9af456197369d74352122b91.zip |
Replace two-step initialization of args with macros.
* args.h (args_init_list, args_init): Return the
struct args * pointer.
(args_decl_list, args_decl): New macros.
* eval.c (apply, do_eval, expand_macro, op_dwim, op_catch,
(mapcarl, lazy_mapcarl): Switch to new macros.
* hash.c (hashl): Likewise.
* lib.c (generic_funcall, lazy_appendl, maxl, minl, funcall,
funcal1, funcall2, funcall3, funcall4, transpose, juxtv,
do_and, do_or, do_iff, unique): Likewise.
* match.c (h_fun, v_fun): Likewise.
* stream.c (vformat): Likewise.
* syslog.c (syslog_wrap): Likewise.
-rw-r--r-- | args.h | 17 | ||||
-rw-r--r-- | eval.c | 23 | ||||
-rw-r--r-- | hash.c | 3 | ||||
-rw-r--r-- | lib.c | 84 | ||||
-rw-r--r-- | match.c | 6 | ||||
-rw-r--r-- | stream.c | 3 | ||||
-rw-r--r-- | syslog.c | 3 |
7 files changed, 55 insertions, 84 deletions
@@ -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; @@ -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); } @@ -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); } @@ -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); } @@ -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)), @@ -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); @@ -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); } |