summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-10-15 00:13:58 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-10-15 00:13:58 -0700
commitdb49aeca0b8cdf6695c3fc0754274398da0234d5 (patch)
tree126a5c227ec88b0649730aa5e4466279d7fb52dc /lib.c
parent227d89b5ec4b967c87cd24d7074ec71e8aad0448 (diff)
downloadtxr-db49aeca0b8cdf6695c3fc0754274398da0234d5.tar.gz
txr-db49aeca0b8cdf6695c3fc0754274398da0234d5.tar.bz2
txr-db49aeca0b8cdf6695c3fc0754274398da0234d5.zip
args: don't use alloca for const size cases.
* args.h (args_decl_list): This macro now handles only constant values of N. It declares an anonyous container struct type which juxtaposes the struc args header with exactly N values. This is simply defined as a local variable without alloca. (args_decl_constsize): Like args_decl, but requiring a constant N; implemented via args_decl_list. (args_decl_list_dyn): New name for the old args_decl_list which calls alloca. No places in the code depend on this at all, except the definition of args_decl. (args_decl): Retargeted to args_decl_list_dyn. There is some inconsistency in the macro naming in that args_decl_constsize depends on args_decl_list, and args_decl depends on arg_decl_list_dyn. This was done to minimize diffs. Most direct uses of args_decl_list have a constant size, but a large number of args_decl uses do not have a constant size. * eval.c (op_catch): Use args_decl_constsize. * ffi.c (ffi_struct_in, ffi_struct_get, union_out): Likewise. * ftw.c (ftw_callback): Likewise. * lib.c (funcall, funcall1, funcall2, funcall3, funcall4, uniq, relate): Likewise. * socket.c (sockaddr_in_unpack, sockaddr_in6_unpack, sockaddr_un_unpack): Likewise. * stream.c (formatv): Likewise. * struct.c (struct_from_plist, struct_from_args, make_struct_lit): Likewise. * sysif.c (termios_unpack): Likewise. * time.c (broken_time_struct): Likewise.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/lib.c b/lib.c
index f6cae965..4b992374 100644
--- a/lib.c
+++ b/lib.c
@@ -8422,7 +8422,7 @@ static NORETURN void wrongargs(val fun)
val funcall(val fun)
{
if (type(fun) != FUN || dbg_backtrace) generic: {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
return generic_funcall(fun, args);
}
@@ -8443,14 +8443,14 @@ val funcall(val fun)
return vm_funcall4(fun, colon_k, colon_k, colon_k, colon_k);
default:
{
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
return vm_execute_closure(fun, args);
}
}
}
if (fun->f.variadic) {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -8500,7 +8500,7 @@ val funcall(val fun)
val funcall1(val fun, val arg)
{
if (type(fun) != FUN || dbg_backtrace) generic: {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
args_add(args, z(arg));
return generic_funcall(fun, args);
}
@@ -8520,7 +8520,7 @@ val funcall1(val fun, val arg)
return vm_funcall4(fun, z(arg), colon_k, colon_k, colon_k);
default:
{
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
args_add(args, arg);
return vm_execute_closure(fun, args);
}
@@ -8528,7 +8528,7 @@ val funcall1(val fun, val arg)
}
if (fun->f.variadic) {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -8581,7 +8581,7 @@ val funcall1(val fun, val arg)
val funcall2(val fun, val arg1, val arg2)
{
if (type(fun) != FUN || dbg_backtrace) generic: {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
args_add2(args, z(arg1), z(arg2));
return generic_funcall(fun, args);
}
@@ -8599,7 +8599,7 @@ val funcall2(val fun, val arg1, val arg2)
return vm_funcall4(fun, z(arg1), z(arg2), colon_k, colon_k);
default:
{
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
args_add2(args, arg1, arg2);
return vm_execute_closure(fun, args);
}
@@ -8607,7 +8607,7 @@ val funcall2(val fun, val arg1, val arg2)
}
if (fun->f.variadic) {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -8664,7 +8664,7 @@ val funcall2(val fun, val arg1, val arg2)
val funcall3(val fun, val arg1, val arg2, val arg3)
{
if (type(fun) != FUN || dbg_backtrace) generic: {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
args_add3(args, z(arg1), z(arg2), z(arg3));
return generic_funcall(fun, args);
}
@@ -8680,14 +8680,14 @@ val funcall3(val fun, val arg1, val arg2, val arg3)
return vm_funcall4(fun, z(arg1), z(arg2), z(arg3), colon_k);
default:
{
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
args_add3(args, arg1, arg2, arg3);
return vm_execute_closure(fun, args);
}
}
}
if (fun->f.variadic) {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -8746,7 +8746,7 @@ val funcall3(val fun, val arg1, val arg2, val arg3)
val funcall4(val fun, val arg1, val arg2, val arg3, val arg4)
{
if (type(fun) != FUN || dbg_backtrace) generic: {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
args_add4(args, z(arg1), z(arg2), z(arg3), z(arg4));
return generic_funcall(fun, args);
}
@@ -8765,7 +8765,7 @@ val funcall4(val fun, val arg1, val arg2, val arg3, val arg4)
}
if (fun->f.variadic) {
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
switch (fun->f.functype) {
case FINTERP:
@@ -11056,7 +11056,7 @@ val unique(val seq, val keyfun, struct args *hashv_args)
val uniq(val seq)
{
- args_decl(hashv_args, ARGS_MIN);
+ args_decl_constsize(hashv_args, ARGS_MIN);
args_add(hashv_args, equal_based_k);
return unique(seq, identity_f, hashv_args);
}
@@ -13354,7 +13354,7 @@ val relate(val domain_seq, val range_seq, val dfl_val)
val lds = length(domain_seq);
val use_hash = and2(gt(lds, num_fast(10)),
le(lds, length(range_seq)));
- args_decl(args, ARGS_MIN);
+ args_decl_constsize(args, ARGS_MIN);
val hash = if2(use_hash, hash_zip(domain_seq, range_seq, args));
return if3(missingp(dfl_val),