aboutsummaryrefslogtreecommitdiff
path: root/ltests.c
diff options
context:
space:
mode:
Diffstat (limited to 'ltests.c')
-rw-r--r--ltests.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/ltests.c b/ltests.c
index 2cc66bca..3496a2b1 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 1.124 2002/06/11 16:23:47 roberto Exp roberto $ 2** $Id: ltests.c,v 1.125 2002/06/13 13:44:50 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -338,6 +338,34 @@ static int string_query (lua_State *L) {
338} 338}
339 339
340 340
341static int xpcall (lua_State *L) {
342 int status;
343 luaL_check_type(L, 1, LUA_TFUNCTION);
344 luaL_check_any(L, 2);
345 lua_pushliteral(L, LUA_TRACEBACK);
346 lua_gettable(L, LUA_REGISTRYINDEX);
347 lua_pushliteral(L, LUA_TRACEBACK);
348 lua_pushvalue(L, 1);
349 lua_settable(L, LUA_REGISTRYINDEX);
350 lua_replace(L, 1);
351 status = lua_pcall(L, lua_gettop(L) - 2, LUA_MULTRET);
352 lua_pushliteral(L, LUA_TRACEBACK);
353 lua_pushvalue(L, 1);
354 lua_settable(L, LUA_REGISTRYINDEX);
355 if (status != 0) {
356 int numres = (status == LUA_ERRRUN) ? 3 : 2;
357 lua_pushnil(L);
358 lua_insert(L, -numres);
359 return numres;
360 }
361 else {
362 lua_pushboolean(L, 1);
363 lua_insert(L, 2);
364 return lua_gettop(L) - 1; /* return `true' + all results */
365 }
366}
367
368
341static int tref (lua_State *L) { 369static int tref (lua_State *L) {
342 int level = lua_gettop(L); 370 int level = lua_gettop(L);
343 int lock = luaL_opt_int(L, 2, 1); 371 int lock = luaL_opt_int(L, 2, 1);
@@ -402,7 +430,7 @@ static int doonnewstack (lua_State *L) {
402 const char *s = luaL_check_lstr(L, 1, &l); 430 const char *s = luaL_check_lstr(L, 1, &l);
403 int status = luaL_loadbuffer(L1, s, l, s); 431 int status = luaL_loadbuffer(L1, s, l, s);
404 if (status == 0) 432 if (status == 0)
405 status = lua_pcall(L1, 0, 0, 0); 433 status = lua_pcall(L1, 0, 0);
406 lua_pushnumber(L, status); 434 lua_pushnumber(L, status);
407 lua_closethread(L, L1); 435 lua_closethread(L, L1);
408 return 1; 436 return 1;
@@ -639,7 +667,7 @@ static int testC (lua_State *L) {
639 else if EQ("call") { 667 else if EQ("call") {
640 int narg = getnum; 668 int narg = getnum;
641 int nres = getnum; 669 int nres = getnum;
642 lua_call(L, narg, nres); 670 lua_pcall(L, narg, nres);
643 } 671 }
644 else if EQ("loadstring") { 672 else if EQ("loadstring") {
645 size_t sl; 673 size_t sl;
@@ -659,7 +687,7 @@ static int testC (lua_State *L) {
659 else if EQ("type") { 687 else if EQ("type") {
660 lua_pushstring(L, lua_typename(L, lua_type(L, getnum))); 688 lua_pushstring(L, lua_typename(L, lua_type(L, getnum)));
661 } 689 }
662 else luaL_verror(L, "unknown instruction %s", buff); 690 else luaL_error(L, "unknown instruction %s", buff);
663 } 691 }
664 return 0; 692 return 0;
665} 693}
@@ -677,6 +705,7 @@ static const struct luaL_reg tests_funcs[] = {
677 {"loadlib", loadlib}, 705 {"loadlib", loadlib},
678 {"stacklevel", stacklevel}, 706 {"stacklevel", stacklevel},
679 {"querystr", string_query}, 707 {"querystr", string_query},
708 {"xpcall", xpcall},
680 {"querytab", table_query}, 709 {"querytab", table_query},
681 {"testC", testC}, 710 {"testC", testC},
682 {"ref", tref}, 711 {"ref", tref},