Browse Source

Avoid stack resizes while recording calls to vararg functions.

FUNCV might have been recorded twice (with ill effects).
Mike Pall 14 years ago
parent
commit
d0b283e596
1 changed files with 5 additions and 2 deletions
  1. 5 2
      src/lj_dispatch.c

+ 5 - 2
src/lj_dispatch.c

@@ -388,9 +388,12 @@ void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc)
 static int call_init(lua_State *L, GCfunc *fn)
 {
   if (isluafunc(fn)) {
-    int numparams = funcproto(fn)->numparams;
+    GCproto *pt = funcproto(fn);
+    int numparams = pt->numparams;
     int gotparams = (int)(L->top - L->base);
-    lj_state_checkstack(L, (MSize)numparams);
+    int need = pt->framesize;
+    if ((pt->flags & PROTO_IS_VARARG)) need += 1+gotparams;
+    lj_state_checkstack(L, (MSize)need);
     numparams -= gotparams;
     return numparams >= 0 ? numparams : 0;
   } else {