diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-04-17 06:59:29 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-04-17 06:59:29 -0700 |
commit | 392f2f4b28c44d208b551e1354a02fe392968c0d (patch) | |
tree | 9a4cdcd103e6b312c00d2927a21ab4aac99dec69 /vm.c | |
parent | 245884375b2d8e2a6d856a85e281e84147a1caa7 (diff) | |
download | txr-392f2f4b28c44d208b551e1354a02fe392968c0d.tar.gz txr-392f2f4b28c44d208b551e1354a02fe392968c0d.tar.bz2 txr-392f2f4b28c44d208b551e1354a02fe392968c0d.zip |
vm: clear stack memory moved to heap.
* vm.c (vm_make_closure): When a display frame is captured by
a closure and moves into the heap object, the original should
be cleared to all nil values, otherwise it can cause spurious
retention of garbage.
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -245,9 +245,11 @@ static val vm_make_closure(struct vm *vm, int frsz) case NUM: { val heap_vec = vector(vec, nil); + size_t size = sizeof *cdi->mem * c_num(vec); cdi->vec = heap_vec; cdi->mem = heap_vec->v.vec; - memcpy(cdi->mem, mem, sizeof *cdi->mem * c_num(vec)); + memcpy(cdi->mem, mem, size); + memset(mem, 0, size); mut(closure); *sdi = *cdi; break; |