>From 52412d6a14d779dc34012db1993f71376ea5b873 Mon Sep 17 00:00:00 2001 From: Evan Hanson Date: Sun, 4 Oct 2015 20:25:56 +1300 Subject: [PATCH 2/2] Loop to known list length when copying args into av during C_apply* This avoids some unnecessary bit-twiddling, since we already know the length of the list to copy. --- runtime.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/runtime.c b/runtime.c index 102fa42..10d70f7 100644 --- a/runtime.c +++ b/runtime.c @@ -5965,7 +5965,7 @@ void C_ccall C_apply(C_word c, C_word *av) fn = av[ 2 ]; int av2_size, i, n = c - 3; int non_list_args = n - 1; - C_word lst, *ptr, *av2; + C_word lst, len, *ptr, *av2; if(c < 4) C_bad_min_argc(c, 4); @@ -5976,7 +5976,8 @@ void C_ccall C_apply(C_word c, C_word *av) if(lst != C_SCHEME_END_OF_LIST && (C_immediatep(lst) || C_block_header(lst) != C_PAIR_TAG)) barf(C_BAD_ARGUMENT_TYPE_ERROR, "apply", lst); - av2_size = 2 + non_list_args + C_unfix(C_u_i_length(lst)); + len = C_unfix(C_u_i_length(lst)); + av2_size = 2 + non_list_args + len; if(!C_demand(av2_size)) C_save_and_reclaim((void *)C_apply, c, av); @@ -5990,7 +5991,7 @@ void C_ccall C_apply(C_word c, C_word *av) ptr += non_list_args; } - while(!C_immediatep(lst) && C_block_header(lst) == C_PAIR_TAG) { + while(len--) { *(ptr++) = C_u_i_car(lst); lst = C_u_i_cdr(lst); } @@ -6129,7 +6130,7 @@ void C_ccall C_apply_values(C_word c, C_word *av) av2 = C_alloc(n); av2[ 0 ] = k; ptr = av2 + 1; - while(!C_immediatep(lst) && C_block_header(lst) == C_PAIR_TAG) { + while(len--) { *(ptr++) = C_u_i_car(lst); lst = C_u_i_cdr(lst); } -- 2.5.3