diff options
Diffstat (limited to 'lbaselib.c')
| -rw-r--r-- | lbaselib.c | 22 |
1 files changed, 5 insertions, 17 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lbaselib.c,v 1.91 2002/07/17 16:25:13 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.92 2002/08/05 14:46:02 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 | */ |
| @@ -276,9 +276,7 @@ static int luaB_unpack (lua_State *L) { | |||
| 276 | static int luaB_pcall (lua_State *L) { | 276 | static int luaB_pcall (lua_State *L) { |
| 277 | int status; | 277 | int status; |
| 278 | luaL_check_any(L, 1); | 278 | luaL_check_any(L, 1); |
| 279 | status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET); | 279 | status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0); |
| 280 | if (status) /* error? */ | ||
| 281 | lua_pcallreset(L); /* reset error handler */ | ||
| 282 | lua_pushboolean(L, (status == 0)); | 280 | lua_pushboolean(L, (status == 0)); |
| 283 | lua_insert(L, 1); | 281 | lua_insert(L, 1); |
| 284 | return lua_gettop(L); /* return status + all results */ | 282 | return lua_gettop(L); /* return status + all results */ |
| @@ -287,22 +285,12 @@ static int luaB_pcall (lua_State *L) { | |||
| 287 | 285 | ||
| 288 | static int luaB_xpcall (lua_State *L) { | 286 | static int luaB_xpcall (lua_State *L) { |
| 289 | int status; | 287 | int status; |
| 290 | int ref; | ||
| 291 | luaL_check_any(L, 2); | 288 | luaL_check_any(L, 2); |
| 292 | lua_settop(L, 2); | 289 | lua_settop(L, 2); |
| 293 | ref = lua_ref(L, 1); /* save error function */ | 290 | lua_insert(L, 1); /* put error function under function to be called */ |
| 294 | status = lua_pcall(L, 0, LUA_MULTRET); | 291 | status = lua_pcall(L, 0, LUA_MULTRET, 1); |
| 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 */ | ||
| 302 | } | ||
| 303 | lua_unref(L, ref); /* free reference */ | ||
| 304 | lua_pushboolean(L, (status == 0)); | 292 | lua_pushboolean(L, (status == 0)); |
| 305 | lua_insert(L, 1); | 293 | lua_replace(L, 1); |
| 306 | return lua_gettop(L); /* return status + all results */ | 294 | return lua_gettop(L); /* return status + all results */ |
| 307 | } | 295 | } |
| 308 | 296 | ||
