summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-04-06 23:25:23 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-04-06 23:25:23 -0700
commit17e3178a5bd5da2e731f11eba3cbcca98d179470 (patch)
tree902ed70ec266923b4814a7650654fee0fef977ff
parent0ace053123f3f77e6a824afb8da3418752d43f22 (diff)
downloadtxr-17e3178a5bd5da2e731f11eba3cbcca98d179470.tar.gz
txr-17e3178a5bd5da2e731f11eba3cbcca98d179470.tar.bz2
txr-17e3178a5bd5da2e731f11eba3cbcca98d179470.zip
vm: allow vm description to be callable as function.
* lib.c (generic_funall): Handle vm-desc objects via vm_execute_toplevel. * vm.h (vm_desc_s, vm_closure_s): Declared.
-rw-r--r--lib.c4
-rw-r--r--vm.h2
2 files changed, 6 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index 980fe768..7219d2d2 100644
--- a/lib.c
+++ b/lib.c
@@ -6253,6 +6253,10 @@ val generic_funcall(val fun, struct args *args_in)
default:
callerror(fun, lit("too many arguments"));
}
+ } else if (fun->co.cls == vm_desc_s) {
+ if (args->fill || args->list)
+ callerror(fun, lit("too many arguments"));
+ return vm_execute_toplevel(fun);
} else if (fun->co.cls == carray_s) {
goto carray;
} else if (obj_struct_p(fun)) {
diff --git a/vm.h b/vm.h
index 1a8a1c8e..da2fab08 100644
--- a/vm.h
+++ b/vm.h
@@ -25,6 +25,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+extern val vm_desc_s, vm_closure_s;
+
val vm_make_desc(val nlevels, val nregs, val bytecode,
val datavec, val funvec);
val vm_execute_toplevel(val desc);