From c7677471918fa55095f4993484eb5805091364fd Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 13 May 2003 16:22:19 -0300 Subject: [PATCH] new (internal) macros for error handling --- ldo.c | 21 ++++++++++++++++++--- ltests.c | 11 ++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ldo.c b/ldo.c index 6dbfe833..9c5f7f3a 100644 --- a/ldo.c +++ b/ldo.c @@ -1,5 +1,5 @@ /* -** $Id: ldo.c,v 1.216 2003/02/28 19:45:15 roberto Exp roberto $ +** $Id: ldo.c,v 1.217 2003/04/03 13:35:34 roberto Exp roberto $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ @@ -39,6 +39,20 @@ */ +#ifndef LUA_USEEXCEPTIONS + +#define L_THROW(c) longjmp((c)->b, 1) +#define L_TRY(c,a) if (setjmp((c)->b) == 0) { a } + +#else + +#define L_THROW(c) throw(c) +#define L_TRY(c,a) try { a } catch(...) \ + { if ((c)->status == 0) (c)->status = -1; } + +#endif + + /* chain list of long jump buffers */ struct lua_longjmp { struct lua_longjmp *previous; @@ -70,7 +84,7 @@ static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { void luaD_throw (lua_State *L, int errcode) { if (L->errorJmp) { L->errorJmp->status = errcode; - longjmp(L->errorJmp->b, 1); + L_THROW(L->errorJmp); } else { G(L)->panic(L); @@ -84,8 +98,9 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { lj.status = 0; lj.previous = L->errorJmp; /* chain new error handler */ L->errorJmp = &lj; - if (setjmp(lj.b) == 0) + L_TRY(&lj, (*f)(L, ud); + ); L->errorJmp = lj.previous; /* restore old error handler */ return lj.status; } diff --git a/ltests.c b/ltests.c index b3f6d56b..7527c40a 100644 --- a/ltests.c +++ b/ltests.c @@ -1,5 +1,5 @@ /* -** $Id: ltests.c,v 1.158 2003/04/07 14:35:00 roberto Exp roberto $ +** $Id: ltests.c,v 1.159 2003/04/28 19:58:06 roberto Exp roberto $ ** Internal Module for Debugging of the Lua Implementation ** See Copyright Notice in lua.h */ @@ -733,6 +733,15 @@ static int testC (lua_State *L) { luaL_setn(L, i, n); lua_pop(L, 1); } + else if EQ("throw") { +#ifdef _cplusplus +static struct X { int x; } x; + throw x; +#else + luaL_error(L, "C++"); +#endif + break; + } else luaL_error(L, "unknown instruction %s", buff); } return 0;