summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-10-14 07:37:02 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-10-14 07:37:02 -0700
commitc7a8b7e7402583e24e418523fe00c1f2ffef0f2f (patch)
treed81f4b6cbde54bae4d23fbc109a3cb8a32a69f1b
parent378546295be6b3a72ee3792d9175501bc77c016d (diff)
downloadtxr-c7a8b7e7402583e24e418523fe00c1f2ffef0f2f.tar.gz
txr-c7a8b7e7402583e24e418523fe00c1f2ffef0f2f.tar.bz2
txr-c7a8b7e7402583e24e418523fe00c1f2ffef0f2f.zip
funcall: don't route to generic_fun on optargs.
* lib.c (funcall, funcall1, funcall2, funcall3, funcall4): Do not go through the generic_funcall slow path just because the target function has optional arguments. It's possible that the call is supplying all of the required arguments. Let's try it like that and then if it doesn't work and there are optionals, check again and go the generic_funcall route. This might not be an overall improvement by itself, if we end up going to generic_funcall in more cases than not. However, this change paves the way for more changes: handling some cases of optargs in these helpers.
-rw-r--r--lib.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib.c b/lib.c
index 9e8f9d55..c05246d1 100644
--- a/lib.c
+++ b/lib.c
@@ -8421,7 +8421,7 @@ static NORETURN void wrongargs(val fun)
val funcall(val fun)
{
- if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
+ if (type(fun) != FUN || dbg_backtrace) generic: {
args_decl(args, ARGS_MIN);
return generic_funcall(fun, args);
}
@@ -8455,12 +8455,14 @@ val funcall(val fun)
break;
}
}
+ if (fun->f.optargs)
+ goto generic;
wrongargs(fun);
}
val funcall1(val fun, val arg)
{
- if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
+ if (type(fun) != FUN || dbg_backtrace) generic: {
args_decl(args, ARGS_MIN);
args_add(args, z(arg));
return generic_funcall(fun, args);
@@ -8505,12 +8507,14 @@ val funcall1(val fun, val arg)
break;
}
}
+ if (fun->f.optargs)
+ goto generic;
wrongargs(fun);
}
val funcall2(val fun, val arg1, val arg2)
{
- if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
+ if (type(fun) != FUN || dbg_backtrace) generic: {
args_decl(args, ARGS_MIN);
args_add2(args, z(arg1), z(arg2));
return generic_funcall(fun, args);
@@ -8561,12 +8565,14 @@ val funcall2(val fun, val arg1, val arg2)
break;
}
}
+ if (fun->f.optargs)
+ goto generic;
wrongargs(fun);
}
val funcall3(val fun, val arg1, val arg2, val arg3)
{
- if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
+ if (type(fun) != FUN || dbg_backtrace) generic: {
args_decl(args, ARGS_MIN);
args_add3(args, z(arg1), z(arg2), z(arg3));
return generic_funcall(fun, args);
@@ -8623,12 +8629,14 @@ val funcall3(val fun, val arg1, val arg2, val arg3)
break;
}
}
+ if (fun->f.optargs)
+ goto generic;
wrongargs(fun);
}
val funcall4(val fun, val arg1, val arg2, val arg3, val arg4)
{
- if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
+ if (type(fun) != FUN || dbg_backtrace) generic: {
args_decl(args, ARGS_MIN);
args_add4(args, z(arg1), z(arg2), z(arg3), z(arg4));
return generic_funcall(fun, args);
@@ -8691,6 +8699,8 @@ val funcall4(val fun, val arg1, val arg2, val arg3, val arg4)
break;
}
}
+ if (fun->f.optargs)
+ goto generic;
wrongargs(fun);
}