From f751cd1d6ff2ff1caab338cd2294f69cab34ae04 Mon Sep 17 00:00:00 2001
From: Mike Pall <mike>
Date: Mon, 22 Feb 2010 21:21:52 +0100
Subject: Do not patch parent exit for a stack check.

---
 src/lj_asm.c | 8 ++++++++
 1 file changed, 8 insertions(+)

(limited to 'src')

diff --git a/src/lj_asm.c b/src/lj_asm.c
index db71aebc..1e934d7c 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -3532,8 +3532,16 @@ void lj_asm_patchexit(jit_State *J, Trace *T, ExitNo exitno, MCode *target)
   MSize len = T->szmcode;
   MCode *px = exitstub_addr(J, exitno) - 6;
   MCode *pe = p+len-6;
+  uint32_t stateaddr = u32ptr(&J2G(J)->vmstate);
   if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px)
     *(int32_t *)(p+len-4) = (int32_t)(target - (p+len));
+  /* Do not patch parent exit for a stack check. Skip beyond vmstate update. */
+  for (; p < pe; p++)
+    if (*(uint32_t *)(p+(LJ_64 ? 3 : 2)) == stateaddr && p[0] == XI_MOVmi) {
+      p += LJ_64 ? 11 : 10;
+      break;
+    }
+  lua_assert(p < pe);
   for (; p < pe; p++) {
     if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px) {
       *(int32_t *)(p+2) = (int32_t)(target - (p+6));
-- 
cgit v1.2.3-55-g6feb