|
@@ -88,7 +88,7 @@ struct lua_longjmp {
|
|
|
};
|
|
|
|
|
|
|
|
|
-static void seterrorobj (lua_State *L, int errcode, StkId oldtop) {
|
|
|
+void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
|
|
|
switch (errcode) {
|
|
|
case LUA_ERRMEM: { /* memory error? */
|
|
|
setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */
|
|
@@ -121,7 +121,7 @@ l_noret luaD_throw (lua_State *L, int errcode) {
|
|
|
}
|
|
|
else { /* no handler at all; abort */
|
|
|
if (g->panic) { /* panic function? */
|
|
|
- seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */
|
|
|
+ luaD_seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */
|
|
|
if (L->ci->top < L->top)
|
|
|
L->ci->top = L->top; /* pushing msg. can break this invariant */
|
|
|
lua_unlock(L);
|
|
@@ -584,8 +584,8 @@ static int recover (lua_State *L, int status) {
|
|
|
if (ci == NULL) return 0; /* no recovery point */
|
|
|
/* "finish" luaD_pcall */
|
|
|
oldtop = restorestack(L, ci->u2.funcidx);
|
|
|
- luaF_close(L, oldtop);
|
|
|
- seterrorobj(L, status, oldtop);
|
|
|
+ luaF_close(L, oldtop, status);
|
|
|
+ luaD_seterrorobj(L, status, oldtop);
|
|
|
L->ci = ci;
|
|
|
L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */
|
|
|
L->nny = 0; /* should be zero to be yieldable */
|
|
@@ -678,7 +678,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,
|
|
|
}
|
|
|
if (unlikely(errorstatus(status))) { /* unrecoverable error? */
|
|
|
L->status = cast_byte(status); /* mark thread as 'dead' */
|
|
|
- seterrorobj(L, status, L->top); /* push error message */
|
|
|
+ luaD_seterrorobj(L, status, L->top); /* push error message */
|
|
|
L->ci->top = L->top;
|
|
|
}
|
|
|
else lua_assert(status == L->status); /* normal end or yield */
|
|
@@ -726,6 +726,11 @@ LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx,
|
|
|
}
|
|
|
|
|
|
|
|
|
+/*
|
|
|
+** Call the C function 'func' in protected mode, restoring basic
|
|
|
+** thread information ('allowhook', 'nny', etc.) and in particular
|
|
|
+** its stack level in case of errors.
|
|
|
+*/
|
|
|
int luaD_pcall (lua_State *L, Pfunc func, void *u,
|
|
|
ptrdiff_t old_top, ptrdiff_t ef) {
|
|
|
int status;
|
|
@@ -737,11 +742,12 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u,
|
|
|
status = luaD_rawrunprotected(L, func, u);
|
|
|
if (unlikely(status != LUA_OK)) { /* an error occurred? */
|
|
|
StkId oldtop = restorestack(L, old_top);
|
|
|
- luaF_close(L, oldtop); /* close possible pending closures */
|
|
|
- seterrorobj(L, status, oldtop);
|
|
|
L->ci = old_ci;
|
|
|
L->allowhook = old_allowhooks;
|
|
|
L->nny = old_nny;
|
|
|
+ status = luaF_close(L, oldtop, status);
|
|
|
+ oldtop = restorestack(L, old_top); /* previous call may change stack */
|
|
|
+ luaD_seterrorobj(L, status, oldtop);
|
|
|
luaD_shrinkstack(L);
|
|
|
}
|
|
|
L->errfunc = old_errfunc;
|