diff options
author | Mike Pall <mike> | 2012-03-20 14:18:14 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2012-03-20 14:18:14 +0100 |
commit | 9589e11e443b5c86db6e3e42dae22ac69d55ad95 (patch) | |
tree | 382a16b18e18a072d8fb35acc3b9a4fb9ac4d031 | |
parent | 5dbb6671a3b1041108616d59169b868f0a7c8646 (diff) | |
download | luajit2-9589e11e443b5c86db6e3e42dae22ac69d55ad95.tar.gz |
Avoid recursive GC steps after GC-triggered trace exit.
-rw-r--r-- | src/lj_trace.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c index c1a22518..ad00dc67 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c @@ -775,10 +775,12 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) pc = exd.pc; cf = cframe_raw(L->cframe); setcframe_pc(cf, pc); - if (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize) - lj_gc_step(L); /* Exited because of GC: drive GC forward. */ - else + if (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize) { + if (!(G(L)->hookmask & HOOK_GC)) + lj_gc_step(L); /* Exited because of GC: drive GC forward. */ + } else { trace_hotside(J, pc); + } if (bc_op(*pc) == BC_JLOOP) { BCIns *retpc = &traceref(J, bc_d(*pc))->startins; if (bc_isret(bc_op(*retpc))) { |