From 4714d5b8ca811577853ea2dd9674b249a2d76978 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 23 Mar 2020 07:03:24 -0700 Subject: 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. --- struct.c | 19 ++++++++++--------- 1 file 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) -- cgit v1.2.3