issue #163 Maintain optionality of defer statement

memtest 1.0-beta4
Dibyendu Majumdar 4 years ago
parent b63005fd3f
commit 73c2c6426f

@ -32,7 +32,7 @@
#define upisopen(up) ((up)->v != &(up)->u.value)
#ifdef RAVI_DEFER_STATEMENT
/*
** Special "status" for 'luaF_close'
*/
@ -42,7 +42,7 @@
/* close upvalues running all closing methods in protected mode */
#define CLOSEPROTECT (-2)
#endif
LUAI_FUNC Proto *luaF_newproto (lua_State *L);
LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems);

@ -226,8 +226,9 @@ extern const char lua_ident[];
LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
LUA_API void (lua_close) (lua_State *L);
LUA_API lua_State *(lua_newthread) (lua_State *L);
#ifdef RAVI_DEFER_STATEMENT
LUA_API int (lua_resetthread) (lua_State *L);
#endif
LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);

@ -75,9 +75,11 @@ static int luaB_auxwrap (lua_State *L) {
lua_State *co = lua_tothread(L, lua_upvalueindex(1));
int r = auxresume(L, co, lua_gettop(L));
if (r < 0) {
#ifdef RAVI_DEFER_STATEMENT
int stat = lua_status(co);
if (stat != LUA_OK && stat != LUA_YIELD)
lua_resetthread(co); /* close variables in case of errors */
#endif
if (lua_type(L, -1) == LUA_TSTRING) { /* error object is a string? */
luaL_where(L, 1); /* add extra info, if available */
lua_insert(L, -2);

@ -104,10 +104,12 @@ void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));
break;
}
#ifdef RAVI_DEFER_STATEMENT
case CLOSEPROTECT: {
setnilvalue(oldtop); /* no error message */
break;
}
#endif
default: {
setobjs2s(L, oldtop, L->top - 1); /* error message on current top */
break;
@ -124,7 +126,9 @@ l_noret luaD_throw (lua_State *L, int errcode) {
}
else { /* thread has no error handler */
global_State *g = G(L);
#ifdef RAVI_DEFER_STATEMENT
errcode = luaF_close(L, L->stack, errcode); /* close all upvalues */
#endif
L->status = cast_byte(errcode); /* mark it as dead */
if (g->mainthread->errorJmp) { /* main thread has a handler? */
setobjs2s(L, g->mainthread->top++, L->top - 1); /* copy error obj. */

@ -320,6 +320,7 @@ void luaE_freethread (lua_State *L, lua_State *L1) {
luaM_free(L, l);
}
#ifdef RAVI_DEFER_STATEMENT
int lua_resetthread (lua_State *L) {
CallInfo *ci;
int status;
@ -340,6 +341,7 @@ int lua_resetthread (lua_State *L) {
lua_unlock(L);
return status;
}
#endif
/* TODO following should probably not live here*/

@ -44,8 +44,8 @@ run_lua53_tests "_port=true ravi.auto(true,1)" "Lua53 auto JIT all test failed"
run_ravi_tests language ravi_tests1.ravi "ravi.jit(false)"
run_ravi_tests language ravi_tests1.ravi "ravi.auto(true,1)"
#run_ravi_tests language defer_tests.ravi "ravi.jit(false)"
#run_ravi_tests language defer_tests.ravi "ravi.auto(true,1)"
run_ravi_tests language defer_tests.ravi "ravi.jit(false)"
run_ravi_tests language defer_tests.ravi "ravi.auto(true,1)"
run_ravi_tests language ravi_tests3.ravi "ravi.auto(true,1)"
run_ravi_tests language ravi_errors.ravi "ravi.auto(true,1)"
run_ravi_tests language basics.lua "ravi.auto(true,1)"

Loading…
Cancel
Save