diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-20 21:32:19 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-20 21:32:19 -0700 |
commit | 58b96d9330262d7c80f233e7aa1f4d53a5fdd431 (patch) | |
tree | 7d8ee48b79b0e3b7d604eacc417400c3ac313f86 /gc.c | |
parent | 54921bc3ccd6638b8cd6ad9b59aefcd2e9af4e18 (diff) | |
download | txr-58b96d9330262d7c80f233e7aa1f4d53a5fdd431.tar.gz txr-58b96d9330262d7c80f233e7aa1f4d53a5fdd431.tar.bz2 txr-58b96d9330262d7c80f233e7aa1f4d53a5fdd431.zip |
gc: tail recurse on env rather than code.
* gc.c (mark_obj): When marking functions, tail recurse
on the environment. That's the pointer more likely to be a
gateway to serious depth, rather than the vm description or
interpreted function's source.
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -371,14 +371,15 @@ tail_call: mark_obj(obj->pk.hidhash); mark_obj_tail(obj->pk.symhash); case FUN: - mark_obj(obj->f.env); switch (obj->f.functype) { case FINTERP: - mark_obj_tail(obj->f.f.interp_fun); + mark_obj(obj->f.f.interp_fun); + break; case FVM: - mark_obj_tail(obj->f.f.vm_desc); + mark_obj(obj->f.f.vm_desc); + break; } - return; + mark_obj_tail(obj->f.env); case VEC: { val alloc_size = obj->v.vec[vec_alloc]; |