Browse Source

new (internal) macros for error handling

Roberto Ierusalimschy 22 years ago
parent
commit
c767747191
2 changed files with 28 additions and 4 deletions
  1. 18 3
      ldo.c
  2. 10 1
      ltests.c

+ 18 - 3
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
 ** Stack and Call structure of Lua
 ** See Copyright Notice in lua.h
 ** 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 */
 /* chain list of long jump buffers */
 struct lua_longjmp {
 struct lua_longjmp {
   struct lua_longjmp *previous;
   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) {
 void luaD_throw (lua_State *L, int errcode) {
   if (L->errorJmp) {
   if (L->errorJmp) {
     L->errorJmp->status = errcode;
     L->errorJmp->status = errcode;
-    longjmp(L->errorJmp->b, 1);
+    L_THROW(L->errorJmp);
   }
   }
   else {
   else {
     G(L)->panic(L);
     G(L)->panic(L);
@@ -84,8 +98,9 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
   lj.status = 0;
   lj.status = 0;
   lj.previous = L->errorJmp;  /* chain new error handler */
   lj.previous = L->errorJmp;  /* chain new error handler */
   L->errorJmp = &lj;
   L->errorJmp = &lj;
-  if (setjmp(lj.b) == 0)
+  L_TRY(&lj,
     (*f)(L, ud);
     (*f)(L, ud);
+  );
   L->errorJmp = lj.previous;  /* restore old error handler */
   L->errorJmp = lj.previous;  /* restore old error handler */
   return lj.status;
   return lj.status;
 }
 }

+ 10 - 1
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
 ** Internal Module for Debugging of the Lua Implementation
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -733,6 +733,15 @@ static int testC (lua_State *L) {
       luaL_setn(L, i, n);
       luaL_setn(L, i, n);
       lua_pop(L, 1);
       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);
     else luaL_error(L, "unknown instruction %s", buff);
   }
   }
   return 0;
   return 0;