diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-04-07 09:15:49 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-04-07 09:15:49 -0700 |
commit | 9fb7a82acb99ae9f682c59a67c4fc29d413fac53 (patch) | |
tree | 972d4af1b47cd548fe63e910914230f57e71a30e /vm.c | |
parent | 898d9905a6225f205e17b469efed1cdfddfd81b9 (diff) | |
download | txr-9fb7a82acb99ae9f682c59a67c4fc29d413fac53.tar.gz txr-9fb7a82acb99ae9f682c59a67c4fc29d413fac53.tar.bz2 txr-9fb7a82acb99ae9f682c59a67c4fc29d413fac53.zip |
vm: new accessors for closure objects.
* vm.c (vm_closure_struct): New static function.
(vm_closure_desc, vm_closure_entry): New functions.
(vm_init): sys:vm-closure-desc and sys:vm-closure-entry
intrinsics registered.
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -221,6 +221,11 @@ static void vm_desc_mark(val obj) gc_mark(vd->ftab[i].fb); } +static struct vm_closure *vm_closure_struct(val obj) +{ + return coerce(struct vm_closure *, cobj_handle(obj, vm_closure_s)); +} + static val vm_make_closure(struct vm *vm, int frsz) { size_t dspl_sz = vm->nlvl * sizeof (struct vm_env); @@ -1043,6 +1048,18 @@ val vm_execute_closure(val fun, struct args *args) return vm_execute(&vm); } +static val vm_closure_desc(val closure) +{ + struct vm_closure *vc = vm_closure_struct(closure); + return vc->vd->self; +} + +static val vm_closure_entry(val closure) +{ + struct vm_closure *vc = vm_closure_struct(closure); + return unum(vc->ip); +} + static_def(struct cobj_ops vm_desc_ops = cobj_ops_init(eq, cobj_print_op, @@ -1068,4 +1085,6 @@ void vm_init(void) reg_fun(intern(lit("vm-desc-datavec"), system_package), func_n1(vm_desc_datavec)); reg_fun(intern(lit("vm-desc-funvec"), system_package), func_n1(vm_desc_funvec)); reg_fun(intern(lit("vm-execute-toplevel"), system_package), func_n1(vm_execute_toplevel)); + reg_fun(intern(lit("vm-closure-desc"), system_package), func_n1(vm_closure_desc)); + reg_fun(intern(lit("vm-closure-entry"), system_package), func_n1(vm_closure_entry)); } |