diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-10-14 07:37:02 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-10-14 07:37:02 -0700 |
commit | c7a8b7e7402583e24e418523fe00c1f2ffef0f2f (patch) | |
tree | d81f4b6cbde54bae4d23fbc109a3cb8a32a69f1b | |
parent | 378546295be6b3a72ee3792d9175501bc77c016d (diff) | |
download | txr-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.c | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -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); } |