Răsfoiți Sursa

Remove metamethod frame for errors from internal metamethods.

Mike Pall 14 ani în urmă
părinte
comite
24186e05e6
1 a modificat fișierele cu 6 adăugiri și 3 ștergeri
  1. 6 3
      src/lj_err.c

+ 6 - 3
src/lj_err.c

@@ -903,9 +903,12 @@ LJ_NOINLINE void lj_err_optype_call(lua_State *L, TValue *o)
 /* Error in context of caller. */
 /* Error in context of caller. */
 LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg)
 LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg)
 {
 {
-  cTValue *frame = L->base-1;
-  cTValue *pframe = frame_islua(frame) ? frame_prevl(frame) :
-		    frame_iscont(frame) ? frame_prevd(frame) : NULL;
+  TValue *frame = L->base-1;
+  TValue *pframe = NULL;
+  if (frame_islua(frame))
+    pframe = frame_prevl(frame);
+  else if (frame_iscont(frame))
+    L->base = (pframe = frame_prevd(frame))+1;  /* Remove metamethod frame. */
   err_loc(L, msg, pframe, frame);
   err_loc(L, msg, pframe, frame);
   lj_err_run(L);
   lj_err_run(L);
 }
 }