浏览代码

Avoid recursive GC steps after GC-triggered trace exit.

Mike Pall 13 年之前
父节点
当前提交
9589e11e44
共有 1 个文件被更改,包括 5 次插入3 次删除
  1. 5 3
      src/lj_trace.c

+ 5 - 3
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))) {