From 7b4d5306c7441a373516ee54bd942218f35348c2 Mon Sep 17 00:00:00 2001
From: Mike Pall <mike>
Date: Tue, 5 Nov 2013 19:36:59 +0100
Subject: Fix GC steps threshold handling when called by JIT-compiled code.

Thanks to Cheng, Long.
---
 src/lj_gc.c    | 6 ++++--
 src/lj_trace.c | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/lj_gc.c b/src/lj_gc.c
index 5c665786..7012dbec 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -689,12 +689,14 @@ int LJ_FASTCALL lj_gc_step(lua_State *L)
   } while ((int32_t)lim > 0);
   if (g->gc.debt < GCSTEPSIZE) {
     g->gc.threshold = g->gc.total + GCSTEPSIZE;
+    g->vmstate = ostate;
+    return 1;
   } else {
     g->gc.debt -= GCSTEPSIZE;
     g->gc.threshold = g->gc.total;
+    g->vmstate = ostate;
+    return 0;
   }
-  g->vmstate = ostate;
-  return 0;
 }
 
 /* Ditto, but fix the stack top first. */
diff --git a/src/lj_trace.c b/src/lj_trace.c
index c70fc247..add9da6d 100644
--- a/src/lj_trace.c
+++ b/src/lj_trace.c
@@ -778,7 +778,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
   setcframe_pc(cf, pc);
   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. */
+      lj_gc_check(L);  /* Exited because of GC: drive GC forward. */
   } else {
     trace_hotside(J, pc);
   }
-- 
cgit v1.2.3-55-g6feb