aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-08-05 11:46:02 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-08-05 11:46:02 -0300
commit2dcc31574f0656e84a733dc9f18836d556becba8 (patch)
treed7eea217743cbe24ee8fcd4e027bef7afdfab989
parent390fc99a5c1376e87cd75aa9cbf66c22ada49f89 (diff)
downloadlua-2dcc31574f0656e84a733dc9f18836d556becba8.tar.gz
lua-2dcc31574f0656e84a733dc9f18836d556becba8.tar.bz2
lua-2dcc31574f0656e84a733dc9f18836d556becba8.zip
new function xpcall
-rw-r--r--lbaselib.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/lbaselib.c b/lbaselib.c
index 39f1544e..8ff09683 100644
--- a/lbaselib.c
+++ b/lbaselib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbaselib.c,v 1.90 2002/07/04 17:58:02 roberto Exp roberto $ 2** $Id: lbaselib.c,v 1.91 2002/07/17 16:25:13 roberto Exp roberto $
3** Basic library 3** Basic library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -214,10 +214,9 @@ static int luaB_ipairs (lua_State *L) {
214static int passresults (lua_State *L, int status) { 214static int passresults (lua_State *L, int status) {
215 if (status == 0) return 1; 215 if (status == 0) return 1;
216 else { 216 else {
217 int numres = (status == LUA_ERRRUN) ? 3 : 2;
218 lua_pushnil(L); 217 lua_pushnil(L);
219 lua_insert(L, -numres); 218 lua_insert(L, -2);
220 return numres; 219 return 2;
221 } 220 }
222} 221}
223 222
@@ -278,13 +277,33 @@ static int luaB_pcall (lua_State *L) {
278 int status; 277 int status;
279 luaL_check_any(L, 1); 278 luaL_check_any(L, 1);
280 status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET); 279 status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET);
281 if (status != 0) 280 if (status) /* error? */
282 return passresults(L, status); 281 lua_pcallreset(L); /* reset error handler */
283 else { 282 lua_pushboolean(L, (status == 0));
284 lua_pushboolean(L, 1); 283 lua_insert(L, 1);
285 lua_insert(L, 1); 284 return lua_gettop(L); /* return status + all results */
286 return lua_gettop(L); /* return `true' + all results */ 285}
286
287
288static int luaB_xpcall (lua_State *L) {
289 int status;
290 int ref;
291 luaL_check_any(L, 2);
292 lua_settop(L, 2);
293 ref = lua_ref(L, 1); /* save error function */
294 status = lua_pcall(L, 0, LUA_MULTRET);
295 if (status) { /* error? */
296 if (status == LUA_ERRRUN) { /* run-time error? */
297 lua_getref(L, ref); /* get error function */
298 lua_pushvalue(L, -2); /* error message */
299 lua_call(L, 1, 1); /* call error function */
300 }
301 lua_pcallreset(L); /* reset error handler */
287 } 302 }
303 lua_unref(L, ref); /* free reference */
304 lua_pushboolean(L, (status == 0));
305 lua_insert(L, 1);
306 return lua_gettop(L); /* return status + all results */
288} 307}
289 308
290 309
@@ -466,6 +485,7 @@ static const luaL_reg base_funcs[] = {
466 {"rawget", luaB_rawget}, 485 {"rawget", luaB_rawget},
467 {"rawset", luaB_rawset}, 486 {"rawset", luaB_rawset},
468 {"pcall", luaB_pcall}, 487 {"pcall", luaB_pcall},
488 {"xpcall", luaB_xpcall},
469 {"collectgarbage", luaB_collectgarbage}, 489 {"collectgarbage", luaB_collectgarbage},
470 {"gcinfo", luaB_gcinfo}, 490 {"gcinfo", luaB_gcinfo},
471 {"loadfile", luaB_loadfile}, 491 {"loadfile", luaB_loadfile},
@@ -488,15 +508,8 @@ static int luaB_resume (lua_State *L) {
488 int status; 508 int status;
489 lua_settop(L, 0); 509 lua_settop(L, 0);
490 status = lua_resume(L, co); 510 status = lua_resume(L, co);
491 if (status != 0) { 511 if (status != 0)
492 if (status == LUA_ERRRUN) {
493 if (lua_isstring(L, -1) && lua_isstring(L, -2))
494 lua_concat(L, 2);
495 else
496 lua_pop(L, 1);
497 }
498 return lua_error(L); 512 return lua_error(L);
499 }
500 return lua_gettop(L); 513 return lua_gettop(L);
501} 514}
502 515