diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-03-23 07:03:24 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-03-23 07:03:24 -0700 |
commit | 3afce46748b8efa98570d5c8b0fcf2a151e672a4 (patch) | |
tree | 3c438d6b855dd4e9c7b54188310bd3680172bc62 /struct.c | |
parent | 3d27521df2a8174eb470a30ce6c4fd84b7d61464 (diff) | |
download | txr-3afce46748b8efa98570d5c8b0fcf2a151e672a4.tar.gz txr-3afce46748b8efa98570d5c8b0fcf2a151e672a4.tar.bz2 txr-3afce46748b8efa98570d5c8b0fcf2a151e672a4.zip |
method: use new dynamic args to avoid consing list.
* struct.c (method_args_fun): env parameter is now a dynamic
args object. Code adjusted accordingly.
(method): Duplicate args into a dyn_args object instead of
a list. Because a dyn_args has a car and cdr field, we
can eliminate the two conse as well.
Diffstat (limited to 'struct.c')
-rw-r--r-- | struct.c | 19 |
1 files changed, 10 insertions, 9 deletions
@@ -1530,15 +1530,16 @@ static val method_fun(val env, varg args) return generic_funcall(fun, args_copy); } -static val method_args_fun(val env, varg args) +static val method_args_fun(val dargs, varg args) { - cons_bind (curried_args, fun_strct, env); - cons_bind (fun, strct, fun_strct); - cnum ca_len = c_num(length(curried_args)); - args_decl(args_call, max(args->fill + 1 + ca_len, ARGS_MIN)); + struct args *da = dargs->a.args; + val fun = dargs->a.car; + val strct = dargs->a.cdr; + cnum da_nargs = da->fill + c_num(length(da->list)); + args_decl(args_call, max(args->fill + 1 + da_nargs, ARGS_MIN)); args_add(args_call, strct); - args_add_list(args_call, curried_args); - args_normalize_exact(args_call, ca_len + 1); + args_cat(args_call, da); + args_normalize_exact(args_call, da_nargs + 1); args_cat_zap(args_call, args); return generic_funcall(fun, args_call); } @@ -1553,8 +1554,8 @@ val method_args(val strct, val slotsym, struct args *args) if (!args_more(args, 0)) return func_f0v(cons(slot(strct, slotsym), strct), method_fun); else - return func_f0v(cons(args_get_list(args), - cons(slot(strct, slotsym), strct)), method_args_fun); + return func_f0v(dyn_args(args, slot(strct, slotsym), strct), + method_args_fun); } val super_method(val strct, val slotsym) |