aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-11-11 15:15:06 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-11-11 15:15:06 -0200
commit6624ccff264ae9f7b0edb922cacd5c54826797da (patch)
tree9b0f5e77a5f01e43cab3cfbbc0bf392a524d05d8
parent9a38c08011a2d8a4d291c9267efbdd44e7beb7c4 (diff)
downloadlua-6624ccff264ae9f7b0edb922cacd5c54826797da.tar.gz
lua-6624ccff264ae9f7b0edb922cacd5c54826797da.tar.bz2
lua-6624ccff264ae9f7b0edb922cacd5c54826797da.zip
independent code for 'printstack' + test for panic function can
ran code there
-rw-r--r--ltests.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/ltests.c b/ltests.c
index 3dcc18b4..e99cb8e5 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 2.194 2014/11/10 14:47:29 roberto Exp roberto $ 2** $Id: ltests.c,v 2.195 2014/11/10 17:41:36 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*/
@@ -555,6 +555,16 @@ static int listlocals (lua_State *L) {
555 555
556 556
557 557
558static void printstack (lua_State *L) {
559 int i;
560 int n = lua_gettop(L);
561 for (i = 1; i <= n; i++) {
562 printf("%3d: %s\n", i, luaL_tolstring(L, i, NULL));
563 lua_pop(L, 1);
564 }
565 printf("\n");
566}
567
558 568
559static int get_limits (lua_State *L) { 569static int get_limits (lua_State *L) {
560 lua_createtable(L, 0, 5); 570 lua_createtable(L, 0, 5);
@@ -906,19 +916,18 @@ static int int2fb_aux (lua_State *L) {
906} 916}
907 917
908 918
909struct Aux { jmp_buf jb; const char *msg; }; 919struct Aux { jmp_buf jb; const char *paniccode; lua_State *L; };
910 920
911/* 921/*
912** does a long-jump back to "main program". 922** does a long-jump back to "main program".
913*/ 923*/
914static int panicback (lua_State *L) { 924static int panicback (lua_State *L) {
915 struct Aux *b; 925 struct Aux *b;
916 const char *msg = lua_tostring(L, -1); 926 lua_checkstack(L, 1); /* open space for 'Aux' struct */
917 lua_pop(L, 1);
918 lua_getfield(L, LUA_REGISTRYINDEX, "_jmpbuf"); /* get 'Aux' struct */ 927 lua_getfield(L, LUA_REGISTRYINDEX, "_jmpbuf"); /* get 'Aux' struct */
919 b = (struct Aux *)lua_touserdata(L, -1); 928 b = (struct Aux *)lua_touserdata(L, -1);
920 lua_pop(L, 1); /* remove 'Aux' struct */ 929 lua_pop(L, 1); /* remove 'Aux' struct */
921 b->msg = msg; 930 runC(b->L, L, b->paniccode); /* run optional panic code */
922 longjmp(b->jb, 1); 931 longjmp(b->jb, 1);
923 return 1; /* to avoid warnings */ 932 return 1; /* to avoid warnings */
924} 933}
@@ -926,9 +935,12 @@ static int panicback (lua_State *L) {
926static int checkpanic (lua_State *L) { 935static int checkpanic (lua_State *L) {
927 struct Aux b; 936 struct Aux b;
928 void *ud; 937 void *ud;
929 const char *code = luaL_checkstring(L, 1); /* create new state */ 938 lua_State *L1;
939 const char *code = luaL_checkstring(L, 1);
930 lua_Alloc f = lua_getallocf(L, &ud); 940 lua_Alloc f = lua_getallocf(L, &ud);
931 lua_State *L1 = lua_newstate(f, ud); 941 b.paniccode = luaL_optstring(L, 2, "");
942 b.L = L;
943 L1 = lua_newstate(f, ud); /* create new state */
932 if (L1 == NULL) { /* error? */ 944 if (L1 == NULL) { /* error? */
933 lua_pushnil(L); 945 lua_pushnil(L);
934 return 1; 946 return 1;
@@ -942,7 +954,7 @@ static int checkpanic (lua_State *L) {
942 } 954 }
943 else { /* error handling */ 955 else { /* error handling */
944 /* move error message to original state */ 956 /* move error message to original state */
945 lua_pushstring(L, b.msg); 957 lua_pushstring(L, lua_tostring(L1, -1));
946 } 958 }
947 lua_close(L1); 959 lua_close(L1);
948 return 1; 960 return 1;
@@ -1206,15 +1218,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
1206 printf("%s\n", luaL_tolstring(L1, n, NULL)); 1218 printf("%s\n", luaL_tolstring(L1, n, NULL));
1207 lua_pop(L1, 1); 1219 lua_pop(L1, 1);
1208 } 1220 }
1209 else { 1221 else printstack(L1);
1210 int i;
1211 n = lua_gettop(L1);
1212 for (i = 1; i <= n; i++) {
1213 printf("%s ", luaL_tolstring(L1, i, NULL));
1214 lua_pop(L1, 1);
1215 }
1216 printf("\n");
1217 }
1218 } 1222 }
1219 else if EQ("pushbool") { 1223 else if EQ("pushbool") {
1220 lua_pushboolean(L1, getnum); 1224 lua_pushboolean(L1, getnum);