mirror of https://github.com/rusefi/lua.git
better control (and error recovery) for begin/end blocks
This commit is contained in:
parent
f356eb010b
commit
617be66015
11
lapi.c
11
lapi.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lapi.c,v 1.61 1999/12/01 19:50:08 roberto Exp roberto $
|
** $Id: lapi.c,v 1.62 1999/12/02 16:24:45 roberto Exp roberto $
|
||||||
** Lua API
|
** Lua API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -592,19 +592,16 @@ const char *lua_getobjname (lua_State *L, lua_Object o, const char **name) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef MAX_C_BLOCKS
|
|
||||||
#define MAX_C_BLOCKS 1000 /* arbitrary limit */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void lua_beginblock (lua_State *L) {
|
void lua_beginblock (lua_State *L) {
|
||||||
luaM_growvector(L, L->Cblocks, L->numCblocks, 1, struct C_Lua_Stack,
|
luaM_growvector(L, L->Cblocks, L->numCblocks, 1, struct C_Lua_Stack,
|
||||||
"too many nested blocks", MAX_C_BLOCKS);
|
"too many nested blocks", L->stacksize);
|
||||||
L->Cblocks[L->numCblocks] = L->Cstack;
|
L->Cblocks[L->numCblocks] = L->Cstack;
|
||||||
L->numCblocks++;
|
L->numCblocks++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lua_endblock (lua_State *L) {
|
void lua_endblock (lua_State *L) {
|
||||||
|
if (L->numCblocks <= 0)
|
||||||
|
lua_error(L, "API error - no block to end");
|
||||||
--L->numCblocks;
|
--L->numCblocks;
|
||||||
L->Cstack = L->Cblocks[L->numCblocks];
|
L->Cstack = L->Cblocks[L->numCblocks];
|
||||||
L->top = L->Cstack.base;
|
L->top = L->Cstack.base;
|
||||||
|
|
10
ldo.c
10
ldo.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: ldo.c,v 1.56 1999/12/02 16:41:29 roberto Exp roberto $
|
** $Id: ldo.c,v 1.57 1999/12/06 11:43:58 roberto Exp roberto $
|
||||||
** Stack and Call structure of Lua
|
** Stack and Call structure of Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -243,12 +243,13 @@ void lua_error (lua_State *L, const char *s) {
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Execute a protected call. Assumes that function is at L->Cstack.base and
|
** Execute a protected call. Assumes that function is at Cstack.base and
|
||||||
** parameters are on top of it. Leave nResults on the stack.
|
** parameters are on top of it.
|
||||||
*/
|
*/
|
||||||
int luaD_protectedrun (lua_State *L) {
|
int luaD_protectedrun (lua_State *L) {
|
||||||
struct lua_longjmp myErrorJmp;
|
struct lua_longjmp myErrorJmp;
|
||||||
volatile StkId base = L->Cstack.base;
|
volatile StkId base = L->Cstack.base;
|
||||||
|
volatile int numCblocks = L->numCblocks;
|
||||||
volatile int status;
|
volatile int status;
|
||||||
struct lua_longjmp *volatile oldErr = L->errorJmp;
|
struct lua_longjmp *volatile oldErr = L->errorJmp;
|
||||||
L->errorJmp = &myErrorJmp;
|
L->errorJmp = &myErrorJmp;
|
||||||
|
@ -262,6 +263,7 @@ int luaD_protectedrun (lua_State *L) {
|
||||||
else { /* an error occurred: restore the stack */
|
else { /* an error occurred: restore the stack */
|
||||||
L->Cstack.num = 0; /* no results */
|
L->Cstack.num = 0; /* no results */
|
||||||
L->top = L->Cstack.base = L->Cstack.lua2C = base;
|
L->top = L->Cstack.base = L->Cstack.lua2C = base;
|
||||||
|
L->numCblocks = numCblocks;
|
||||||
restore_stack_limit(L);
|
restore_stack_limit(L);
|
||||||
status = 1;
|
status = 1;
|
||||||
}
|
}
|
||||||
|
@ -276,6 +278,7 @@ int luaD_protectedrun (lua_State *L) {
|
||||||
static int protectedparser (lua_State *L, ZIO *z, int bin) {
|
static int protectedparser (lua_State *L, ZIO *z, int bin) {
|
||||||
struct lua_longjmp myErrorJmp;
|
struct lua_longjmp myErrorJmp;
|
||||||
volatile StkId base = L->Cstack.base;
|
volatile StkId base = L->Cstack.base;
|
||||||
|
volatile int numCblocks = L->numCblocks;
|
||||||
volatile int status;
|
volatile int status;
|
||||||
TProtoFunc *volatile tf;
|
TProtoFunc *volatile tf;
|
||||||
struct lua_longjmp *volatile oldErr = L->errorJmp;
|
struct lua_longjmp *volatile oldErr = L->errorJmp;
|
||||||
|
@ -288,6 +291,7 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) {
|
||||||
else { /* an error occurred: restore Cstack and top */
|
else { /* an error occurred: restore Cstack and top */
|
||||||
L->Cstack.num = 0; /* no results */
|
L->Cstack.num = 0; /* no results */
|
||||||
L->top = L->Cstack.base = L->Cstack.lua2C = base;
|
L->top = L->Cstack.base = L->Cstack.lua2C = base;
|
||||||
|
L->numCblocks = numCblocks;
|
||||||
tf = NULL;
|
tf = NULL;
|
||||||
status = 1;
|
status = 1;
|
||||||
}
|
}
|
||||||
|
|
3
lstate.c
3
lstate.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lstate.c,v 1.19 1999/12/01 19:50:08 roberto Exp roberto $
|
** $Id: lstate.c,v 1.20 1999/12/06 11:41:28 roberto Exp roberto $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -99,6 +99,7 @@ void lua_close (lua_State *L) {
|
||||||
luaM_free(L, L->refArray);
|
luaM_free(L, L->refArray);
|
||||||
luaM_free(L, L->Mbuffer);
|
luaM_free(L, L->Mbuffer);
|
||||||
luaM_free(L, L->Cblocks);
|
luaM_free(L, L->Cblocks);
|
||||||
|
LUA_ASSERT(L, L->numCblocks == 0, "Cblocks still open");
|
||||||
LUA_ASSERT(L, L->nblocks == 0, "wrong count for nblocks");
|
LUA_ASSERT(L, L->nblocks == 0, "wrong count for nblocks");
|
||||||
LUA_ASSERT(L, L != lua_state || L->Cstack.lua2C == L->stack, "bad stack");
|
LUA_ASSERT(L, L != lua_state || L->Cstack.lua2C == L->stack, "bad stack");
|
||||||
LUA_ASSERT(L, L != lua_state || L->Cstack.base == L->stack, "bad stack");
|
LUA_ASSERT(L, L != lua_state || L->Cstack.base == L->stack, "bad stack");
|
||||||
|
|
Loading…
Reference in New Issue