summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-11-16 07:16:40 -0800
committerKaz Kylheku <kaz@kylheku.com>2018-11-16 07:16:40 -0800
commitedc808bf0ccba62aee1a5e49ae31baebdfc1c9a5 (patch)
tree9ae7e258eaa3681f7fcfe23a31753977a7fa6bb6 /lib.c
parent7ad10f417a5be78a7dec3b436ba6c37580b92340 (diff)
downloadtxr-edc808bf0ccba62aee1a5e49ae31baebdfc1c9a5.tar.gz
txr-edc808bf0ccba62aee1a5e49ae31baebdfc1c9a5.tar.bz2
txr-edc808bf0ccba62aee1a5e49ae31baebdfc1c9a5.zip
vm: provide special case call entry points.
* lib.c (funcall, funcall1, funcall2, funcall3, funcall4): Use vm_funcall, vm_funcall1, vm_funcall2, vm_funcall3, and vm_funcall4, respectively instead of the general vm_execute_closure. Also, missing argument count check added in funcall. * vm.c (vm_funcall_common): New macro. (vm_funcall, vm_funcall1, vm_funcall2, vm_funcall3, vm_funcall4): New functions. * vm.h (vm_funcall, vm_funcall1, vm_funcall2, vm_funcall3, vm_funcall4): Declared.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/lib.c b/lib.c
index 3d17a562..69712f00 100644
--- a/lib.c
+++ b/lib.c
@@ -6439,8 +6439,9 @@ val funcall(val fun)
switch (fun->f.functype) {
case FVM:
{
- args_decl(args, ARGS_MIN);
- return vm_execute_closure(fun, args);
+ if (fun->f.fixparam != 0)
+ break;
+ return vm_funcall(fun);
}
case F0:
return fun->f.f.f0(fun->f.env);
@@ -6490,11 +6491,9 @@ val funcall1(val fun, val arg)
switch (fun->f.functype) {
case FVM:
{
- args_decl(args, ARGS_MIN);
if (fun->f.fixparam != 1)
break;
- args_add(args, arg);
- return vm_execute_closure(fun, args);
+ return vm_funcall1(fun, z(arg));
}
case F1:
return fun->f.f.f1(fun->f.env, z(arg));
@@ -6550,11 +6549,9 @@ val funcall2(val fun, val arg1, val arg2)
switch (fun->f.functype) {
case FVM:
{
- args_decl(args, ARGS_MIN);
if (fun->f.fixparam != 2)
break;
- args_add2(args, arg1, arg2);
- return vm_execute_closure(fun, args);
+ return vm_funcall2(fun, z(arg1), z(arg2));
}
case F2:
return fun->f.f.f2(fun->f.env, z(arg1), z(arg2));
@@ -6616,11 +6613,9 @@ val funcall3(val fun, val arg1, val arg2, val arg3)
switch (fun->f.functype) {
case FVM:
{
- args_decl(args, ARGS_MIN);
if (fun->f.fixparam != 3)
break;
- args_add3(args, arg1, arg2, arg3);
- return vm_execute_closure(fun, args);
+ return vm_funcall3(fun, z(arg1), z(arg2), z(arg3));
}
case F3:
return fun->f.f.f3(fun->f.env, z(arg1), z(arg2), z(arg3));
@@ -6688,11 +6683,9 @@ val funcall4(val fun, val arg1, val arg2, val arg3, val arg4)
switch (fun->f.functype) {
case FVM:
{
- args_decl(args, ARGS_MIN);
if (fun->f.fixparam != 4)
break;
- args_add4(args, arg1, arg2, arg3, arg4);
- return vm_execute_closure(fun, args);
+ return vm_funcall4(fun, z(arg1), z(arg2), z(arg3), z(arg4));
}
case F4:
return fun->f.f.f4(fun->f.env, z(arg1), z(arg2), z(arg3), z(arg4));