diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-16 21:34:56 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-16 21:34:56 -0700 |
commit | ba498170706db2c1a53dc3427c584dd74230deef (patch) | |
tree | 57ea36d9d2c5e1faa9b808b26064769337f9a3b1 /lib.c | |
parent | ef95bcaaf056210281a5d5b6916559bad28fd217 (diff) | |
download | txr-ba498170706db2c1a53dc3427c584dd74230deef.tar.gz txr-ba498170706db2c1a53dc3427c584dd74230deef.tar.bz2 txr-ba498170706db2c1a53dc3427c584dd74230deef.zip |
vm: handle FVM function type thorughout run-time.
* gc.c (mark_obj): Recognize FVM functions and mark their
vm_desc.
* lib.c (equal): Handle equality for FVM. If the environment
pointers are equal, consider the functions equal.
(funcall, funcall1, funcall2, funcall3, funcall4):
Recognize and call FVM functions. However, there is
a lack of robustness here that needs to be addressed:
vm_execute_closure doesn't check whether there are
too many or not enough arguments. Interpreted functions
have a run-time check inside bind_args.
(obj_print_impl): Don't print VM functions as #<intrinsic fun...>
but rather #<vm fun>.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 47 |
1 files changed, 46 insertions, 1 deletions
@@ -2509,6 +2509,7 @@ val equal(val left, val right) { switch (left->f.functype) { case FINTERP: return (equal(left->f.f.interp_fun, right->f.f.interp_fun)); + case FVM: return t; case F0: return (left->f.f.f0 == right->f.f.f0) ? t : nil; case F1: return (left->f.f.f1 == right->f.f.f1) ? t : nil; case F2: return (left->f.f.f2 == right->f.f.f2) ? t : nil; @@ -6287,6 +6288,8 @@ val funcall(val fun) switch (fun->f.functype) { case FINTERP: return funcall_interp(fun, args); + case FVM: + return vm_execute_closure(fun, args); case F0: return fun->f.f.f0v(fun->f.env, args); case N0: @@ -6296,6 +6299,11 @@ val funcall(val fun) } } else { switch (fun->f.functype) { + case FVM: + { + args_decl(args, ARGS_MIN); + return vm_execute_closure(fun, args); + } case F0: return fun->f.f.f0(fun->f.env); case N0: @@ -6322,6 +6330,9 @@ val funcall1(val fun, val arg) case FINTERP: args_add(args, arg); return funcall_interp(fun, args); + case FVM: + args_add(args, arg); + return vm_execute_closure(fun, args); case F0: args_add(args, arg); return fun->f.f.f0v(fun->f.env, args); @@ -6337,6 +6348,12 @@ val funcall1(val fun, val arg) } } else { switch (fun->f.functype) { + case FVM: + { + args_decl(args, ARGS_MIN); + args_add(args, arg); + return vm_execute_closure(fun, args); + } case F1: return fun->f.f.f1(fun->f.env, z(arg)); case N1: @@ -6363,6 +6380,9 @@ val funcall2(val fun, val arg1, val arg2) case FINTERP: args_add2(args, arg1, arg2); return funcall_interp(fun, args); + case FVM: + args_add2(args, arg1, arg2); + return vm_execute_closure(fun, args); case F0: args_add2(args, arg1, arg2); return fun->f.f.f0v(fun->f.env, args); @@ -6384,6 +6404,12 @@ val funcall2(val fun, val arg1, val arg2) } } else { switch (fun->f.functype) { + case FVM: + { + args_decl(args, ARGS_MIN); + args_add2(args, arg1, arg2); + return vm_execute_closure(fun, args); + } case F2: return fun->f.f.f2(fun->f.env, z(arg1), z(arg2)); case N2: @@ -6410,6 +6436,9 @@ val funcall3(val fun, val arg1, val arg2, val arg3) case FINTERP: args_add3(args, arg1, arg2, arg3); return funcall_interp(fun, args); + case FVM: + args_add3(args, arg1, arg2, arg3); + return vm_execute_closure(fun, args); case F0: args_add3(args, arg1, arg2, arg3); return fun->f.f.f0v(fun->f.env, args); @@ -6437,6 +6466,12 @@ val funcall3(val fun, val arg1, val arg2, val arg3) } } else { switch (fun->f.functype) { + case FVM: + { + args_decl(args, ARGS_MIN); + args_add3(args, arg1, arg2, arg3); + return vm_execute_closure(fun, args); + } case F3: return fun->f.f.f3(fun->f.env, z(arg1), z(arg2), z(arg3)); case N3: @@ -6463,6 +6498,9 @@ val funcall4(val fun, val arg1, val arg2, val arg3, val arg4) case FINTERP: args_add4(args, arg1, arg2, arg3, arg4); return funcall_interp(fun, args); + case FVM: + args_add4(args, arg1, arg2, arg3, arg4); + return vm_execute_closure(fun, args); case F0: args_add4(args, arg1, arg2, arg3, arg4); return fun->f.f.f0v(fun->f.env, args); @@ -6496,6 +6534,12 @@ val funcall4(val fun, val arg1, val arg2, val arg3, val arg4) } } else { switch (fun->f.functype) { + case FVM: + { + args_decl(args, ARGS_MIN); + args_add4(args, arg1, arg2, arg3, arg4); + return vm_execute_closure(fun, args); + } case F4: return fun->f.f.f4(fun->f.env, z(arg1), z(arg2), z(arg3), z(arg4)); case N4: @@ -11102,7 +11146,8 @@ dot: format(out, lit("#<interpreted fun: ~s ~s>"), car(fun), cadr(fun), nao); } else { - format(out, lit("#<intrinsic fun: ~a param"), + format(out, lit("#<~a fun: ~a param"), + if3(f->functype == FVM, lit("vm"), lit("intrinsic")), num_fast(f->fixparam - f->optargs), nao); if (f->optargs) format(out, lit(" + ~a optional"), |