summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2012-03-20 14:18:14 +0100
committerMike Pall <mike>2012-03-20 14:18:14 +0100
commit9589e11e443b5c86db6e3e42dae22ac69d55ad95 (patch)
tree382a16b18e18a072d8fb35acc3b9a4fb9ac4d031
parent5dbb6671a3b1041108616d59169b868f0a7c8646 (diff)
downloadluajit2-9589e11e443b5c86db6e3e42dae22ac69d55ad95.tar.gz
Avoid recursive GC steps after GC-triggered trace exit.
-rw-r--r--src/lj_trace.c8
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))) {