summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-03-23 07:03:24 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-03-23 07:03:24 -0700
commit3afce46748b8efa98570d5c8b0fcf2a151e672a4 (patch)
tree3c438d6b855dd4e9c7b54188310bd3680172bc62
parent3d27521df2a8174eb470a30ce6c4fd84b7d61464 (diff)
downloadtxr-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.
-rw-r--r--struct.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/struct.c b/struct.c
index f0ceb3d6..b00b7d9e 100644
--- a/struct.c
+++ b/struct.c
@@ -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)