summaryrefslogtreecommitdiffstats
path: root/vm.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-20 21:15:01 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-20 21:15:01 -0700
commit54921bc3ccd6638b8cd6ad9b59aefcd2e9af4e18 (patch)
treefd39b22e206fd0973f0c23fe047d6001303ff42c /vm.c
parentf4d72d5d69d7317bf4e0aa172f1f122bb89210b0 (diff)
downloadtxr-54921bc3ccd6638b8cd6ad9b59aefcd2e9af4e18.tar.gz
txr-54921bc3ccd6638b8cd6ad9b59aefcd2e9af4e18.tar.bz2
txr-54921bc3ccd6638b8cd6ad9b59aefcd2e9af4e18.zip
vm: allocate display in same object as closure.
* vm.c (struct vm_closure): Redeclare display member as array of 1: old-fashioned version of C struct hack. (vm_make_closure): Make the necessary adjustments to the allocation code. (vm_closure_destroy): Static function removed. (vm_closure_mark): Wire in cobj_destroy_free_op once again, since there is just one object to free.
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/vm.c b/vm.c
index 9c9c8525..960dd833 100644
--- a/vm.c
+++ b/vm.c
@@ -97,7 +97,7 @@ struct vm_closure {
int frsz;
int nlvl;
unsigned ip;
- struct vm_env *dspl;
+ struct vm_env dspl[1];
};
val vm_desc_s, vm_closure_s;
@@ -207,9 +207,10 @@ static void vm_desc_mark(val obj)
static val vm_make_closure(struct vm *vm, int frsz)
{
- struct vm_env *dspl = coerce(struct vm_env *,
- chk_calloc(vm->nlvl, sizeof *dspl));
- struct vm_closure *vc = coerce(struct vm_closure *, chk_malloc(sizeof *vc));
+ size_t dspl_sz = vm->nlvl * sizeof (struct vm_env);
+ struct vm_closure *vc = coerce(struct vm_closure *,
+ chk_malloc(offsetof (struct vm_closure, dspl)
+ + dspl_sz));
val closure;
int i;
@@ -217,7 +218,8 @@ static val vm_make_closure(struct vm *vm, int frsz)
vc->ip = vm->ip;
vc->nlvl = vm->lev + 1;
vc->vd = vm->vd;
- vc->dspl = dspl;
+
+ memset(vc->dspl, 0, dspl_sz);
assert (vc->nlvl <= vm->nlvl);
@@ -225,7 +227,7 @@ static val vm_make_closure(struct vm *vm, int frsz)
for (i = 2; i < vc->nlvl; i++) {
struct vm_env *sdi = &vm->dspl[i];
- struct vm_env *cdi = &dspl[i];
+ struct vm_env *cdi = &vc->dspl[i];
val vec = sdi->vec;
val *mem = sdi->mem;
@@ -256,13 +258,6 @@ static val vm_make_closure(struct vm *vm, int frsz)
return closure;
}
-static void vm_closure_destroy(val obj)
-{
- struct vm_closure *vc = coerce(struct vm_closure *, obj->co.handle);
- free(vc->dspl);
- free(vc);
-}
-
static void vm_closure_mark(val obj)
{
struct vm_closure *vc = coerce(struct vm_closure *, obj->co.handle);
@@ -979,7 +974,7 @@ static_def(struct cobj_ops vm_desc_ops =
static_def(struct cobj_ops vm_closure_ops =
cobj_ops_init(eq,
cobj_print_op,
- vm_closure_destroy,
+ cobj_destroy_free_op,
vm_closure_mark,
cobj_eq_hash_op));