diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-12-10 16:21:28 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-12-10 16:21:28 -0200 |
| commit | 1375435e4a9ad5a7625a332934251945586aceca (patch) | |
| tree | e5e861da2bab443321a4f93beb228811e31801a0 | |
| parent | 2bb19ccf08381c7755015dfa61e2eb4675637c78 (diff) | |
| download | lua-1375435e4a9ad5a7625a332934251945586aceca.tar.gz lua-1375435e4a9ad5a7625a332934251945586aceca.tar.bz2 lua-1375435e4a9ad5a7625a332934251945586aceca.zip | |
several new features in testC to allow better testing of lua_resume
at the C API level
| -rw-r--r-- | ltests.c | 89 |
1 files changed, 62 insertions, 27 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 2.80 2009/11/27 15:39:31 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.81 2009/12/01 16:49:48 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 | */ |
| @@ -825,13 +825,13 @@ static void skip (const char **pc) { | |||
| 825 | } | 825 | } |
| 826 | } | 826 | } |
| 827 | 827 | ||
| 828 | static int getnum_aux (lua_State *L, const char **pc) { | 828 | static int getnum_aux (lua_State *L, lua_State *L1, const char **pc) { |
| 829 | int res = 0; | 829 | int res = 0; |
| 830 | int sig = 1; | 830 | int sig = 1; |
| 831 | skip(pc); | 831 | skip(pc); |
| 832 | if (**pc == '.') { | 832 | if (**pc == '.') { |
| 833 | res = cast_int(lua_tonumber(L, -1)); | 833 | res = lua_tointeger(L1, -1); |
| 834 | lua_pop(L, 1); | 834 | lua_pop(L1, 1); |
| 835 | (*pc)++; | 835 | (*pc)++; |
| 836 | return res; | 836 | return res; |
| 837 | } | 837 | } |
| @@ -845,7 +845,7 @@ static int getnum_aux (lua_State *L, const char **pc) { | |||
| 845 | return sig*res; | 845 | return sig*res; |
| 846 | } | 846 | } |
| 847 | 847 | ||
| 848 | static const char *getname_aux (lua_State *L, char *buff, const char **pc) { | 848 | static const char *getstring_aux (lua_State *L, char *buff, const char **pc) { |
| 849 | int i = 0; | 849 | int i = 0; |
| 850 | skip(pc); | 850 | skip(pc); |
| 851 | if (**pc == '"' || **pc == '\'') { /* quoted string? */ | 851 | if (**pc == '"' || **pc == '\'') { /* quoted string? */ |
| @@ -865,22 +865,30 @@ static const char *getname_aux (lua_State *L, char *buff, const char **pc) { | |||
| 865 | } | 865 | } |
| 866 | 866 | ||
| 867 | 867 | ||
| 868 | static int getindex_aux (lua_State *L, const char **pc) { | 868 | static int getindex_aux (lua_State *L, lua_State *L1, const char **pc) { |
| 869 | skip(pc); | 869 | skip(pc); |
| 870 | switch (*(*pc)++) { | 870 | switch (*(*pc)++) { |
| 871 | case 'R': return LUA_REGISTRYINDEX; | 871 | case 'R': return LUA_REGISTRYINDEX; |
| 872 | case 'G': return LUA_GLOBALSINDEX; | 872 | case 'G': return LUA_GLOBALSINDEX; |
| 873 | case 'E': return LUA_ENVIRONINDEX; | 873 | case 'E': return LUA_ENVIRONINDEX; |
| 874 | case 'U': return lua_upvalueindex(getnum_aux(L, pc)); | 874 | case 'U': return lua_upvalueindex(getnum_aux(L, L1, pc)); |
| 875 | default: (*pc)--; return getnum_aux(L, pc); | 875 | default: (*pc)--; return getnum_aux(L, L1, pc); |
| 876 | } | 876 | } |
| 877 | } | 877 | } |
| 878 | 878 | ||
| 879 | |||
| 880 | static void pushcode (lua_State *L, int code) { | ||
| 881 | static const char *const codes[] = {"OK", "YIELD", "ERRRUN", | ||
| 882 | "ERRSYNTAX", "ERRMEM", "ERRGCMM", "ERRERR"}; | ||
| 883 | lua_pushstring(L, codes[code]); | ||
| 884 | } | ||
| 885 | |||
| 886 | |||
| 879 | #define EQ(s1) (strcmp(s1, inst) == 0) | 887 | #define EQ(s1) (strcmp(s1, inst) == 0) |
| 880 | 888 | ||
| 881 | #define getnum (getnum_aux(L, &pc)) | 889 | #define getnum (getnum_aux(L, L1, &pc)) |
| 882 | #define getname (getname_aux(L, buff, &pc)) | 890 | #define getstring (getstring_aux(L, buff, &pc)) |
| 883 | #define getindex (getindex_aux(L, &pc)) | 891 | #define getindex (getindex_aux(L, L1, &pc)) |
| 884 | 892 | ||
| 885 | 893 | ||
| 886 | static int testC (lua_State *L); | 894 | static int testC (lua_State *L); |
| @@ -888,9 +896,10 @@ static int Cfunck (lua_State *L); | |||
| 888 | 896 | ||
| 889 | static int runC (lua_State *L, lua_State *L1, const char *pc) { | 897 | static int runC (lua_State *L, lua_State *L1, const char *pc) { |
| 890 | char buff[300]; | 898 | char buff[300]; |
| 899 | int status = 0; | ||
| 891 | if (pc == NULL) return luaL_error(L, "attempt to runC null script"); | 900 | if (pc == NULL) return luaL_error(L, "attempt to runC null script"); |
| 892 | for (;;) { | 901 | for (;;) { |
| 893 | const char *inst = getname; | 902 | const char *inst = getstring; |
| 894 | if EQ("") return 0; | 903 | if EQ("") return 0; |
| 895 | else if EQ("isnumber") { | 904 | else if EQ("isnumber") { |
| 896 | lua_pushboolean(L1, lua_isnumber(L1, getindex)); | 905 | lua_pushboolean(L1, lua_isnumber(L1, getindex)); |
| @@ -938,7 +947,13 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 938 | lua_pushlightuserdata(L1, &func); | 947 | lua_pushlightuserdata(L1, &func); |
| 939 | } | 948 | } |
| 940 | else if EQ("return") { | 949 | else if EQ("return") { |
| 941 | return getnum; | 950 | int n = getnum; |
| 951 | if (L1 != L) { | ||
| 952 | int i; | ||
| 953 | for (i = 0; i < n; i++) | ||
| 954 | lua_pushstring(L, lua_tostring(L1, -(n - i))); | ||
| 955 | } | ||
| 956 | return n; | ||
| 942 | } | 957 | } |
| 943 | else if EQ("gettop") { | 958 | else if EQ("gettop") { |
| 944 | lua_pushinteger(L1, lua_gettop(L1)); | 959 | lua_pushinteger(L1, lua_gettop(L1)); |
| @@ -953,7 +968,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 953 | lua_pushinteger(L1, getnum); | 968 | lua_pushinteger(L1, getnum); |
| 954 | } | 969 | } |
| 955 | else if EQ("pushstring") { | 970 | else if EQ("pushstring") { |
| 956 | lua_pushstring(L1, getname); | 971 | lua_pushstring(L1, getstring); |
| 957 | } | 972 | } |
| 958 | else if EQ("pushnil") { | 973 | else if EQ("pushnil") { |
| 959 | lua_pushnil(L1); | 974 | lua_pushnil(L1); |
| @@ -997,7 +1012,11 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 997 | } | 1012 | } |
| 998 | else if EQ("getfield") { | 1013 | else if EQ("getfield") { |
| 999 | int t = getindex; | 1014 | int t = getindex; |
| 1000 | lua_getfield(L1, t, getname); | 1015 | lua_getfield(L1, t, getstring); |
| 1016 | } | ||
| 1017 | else if EQ("setfield") { | ||
| 1018 | int t = getindex; | ||
| 1019 | lua_setfield(L1, t, getstring); | ||
| 1001 | } | 1020 | } |
| 1002 | else if EQ("rawgeti") { | 1021 | else if EQ("rawgeti") { |
| 1003 | int t = getindex; | 1022 | int t = getindex; |
| @@ -1033,7 +1052,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 1033 | int op; | 1052 | int op; |
| 1034 | skip(&pc); | 1053 | skip(&pc); |
| 1035 | op = strchr(ops, *pc++) - ops; | 1054 | op = strchr(ops, *pc++) - ops; |
| 1036 | lua_arith(L, op); | 1055 | lua_arith(L1, op); |
| 1037 | } | 1056 | } |
| 1038 | else if EQ("compare") { | 1057 | else if EQ("compare") { |
| 1039 | int a = getindex; | 1058 | int a = getindex; |
| @@ -1048,13 +1067,13 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 1048 | else if EQ("pcall") { | 1067 | else if EQ("pcall") { |
| 1049 | int narg = getnum; | 1068 | int narg = getnum; |
| 1050 | int nres = getnum; | 1069 | int nres = getnum; |
| 1051 | lua_pcall(L1, narg, nres, 0); | 1070 | status = lua_pcall(L1, narg, nres, 0); |
| 1052 | } | 1071 | } |
| 1053 | else if EQ("pcallk") { | 1072 | else if EQ("pcallk") { |
| 1054 | int narg = getnum; | 1073 | int narg = getnum; |
| 1055 | int nres = getnum; | 1074 | int nres = getnum; |
| 1056 | int i = getindex; | 1075 | int i = getindex; |
| 1057 | lua_pcallk(L1, narg, nres, 0, i, Cfunck); | 1076 | status = lua_pcallk(L1, narg, nres, 0, i, Cfunck); |
| 1058 | } | 1077 | } |
| 1059 | else if EQ("callk") { | 1078 | else if EQ("callk") { |
| 1060 | int narg = getnum; | 1079 | int narg = getnum; |
| @@ -1070,6 +1089,25 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 1070 | int i = getindex; | 1089 | int i = getindex; |
| 1071 | return lua_yieldk(L1, nres, i, Cfunck); | 1090 | return lua_yieldk(L1, nres, i, Cfunck); |
| 1072 | } | 1091 | } |
| 1092 | else if EQ("newthread") { | ||
| 1093 | lua_newthread(L1); | ||
| 1094 | } | ||
| 1095 | else if EQ("resume") { | ||
| 1096 | int i = getindex; | ||
| 1097 | status = lua_resume(lua_tothread(L1, i), getnum); | ||
| 1098 | } | ||
| 1099 | else if EQ("pushstatus") { | ||
| 1100 | pushcode(L1, status); | ||
| 1101 | } | ||
| 1102 | else if EQ("xmove") { | ||
| 1103 | int f = getindex; | ||
| 1104 | int t = getindex; | ||
| 1105 | lua_State *fs = (f == 0) ? L1 : lua_tothread(L1, f); | ||
| 1106 | lua_State *ts = (t == 0) ? L1 : lua_tothread(L1, t); | ||
| 1107 | int n = getnum; | ||
| 1108 | if (n == 0) n = lua_gettop(fs); | ||
| 1109 | lua_xmove(fs, ts, n); | ||
| 1110 | } | ||
| 1073 | else if EQ("loadstring") { | 1111 | else if EQ("loadstring") { |
| 1074 | size_t sl; | 1112 | size_t sl; |
| 1075 | const char *s = luaL_checklstring(L1, getnum, &sl); | 1113 | const char *s = luaL_checklstring(L1, getnum, &sl); |
| @@ -1098,12 +1136,9 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 1098 | lua_rawseti(L1, t, i + 1); | 1136 | lua_rawseti(L1, t, i + 1); |
| 1099 | } | 1137 | } |
| 1100 | else if EQ("getctx") { | 1138 | else if EQ("getctx") { |
| 1101 | static const char *const codes[] = {"OK", "YIELD", "ERRRUN", | ||
| 1102 | "ERRSYNTAX", "ERRMEM", "ERRGCMM", "ERRERR"}; | ||
| 1103 | |||
| 1104 | int i = 0; | 1139 | int i = 0; |
| 1105 | int s = lua_getctx(L1, &i); | 1140 | int s = lua_getctx(L1, &i); |
| 1106 | lua_pushstring(L1, codes[s]); | 1141 | pushcode(L1, s); |
| 1107 | lua_pushinteger(L1, i); | 1142 | lua_pushinteger(L1, i); |
| 1108 | } | 1143 | } |
| 1109 | else if EQ("checkstack") { | 1144 | else if EQ("checkstack") { |
| @@ -1111,22 +1146,22 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 1111 | luaL_error(L, "C stack overflow"); | 1146 | luaL_error(L, "C stack overflow"); |
| 1112 | } | 1147 | } |
| 1113 | else if EQ("newmetatable") { | 1148 | else if EQ("newmetatable") { |
| 1114 | lua_pushboolean(L1, luaL_newmetatable(L1, getname)); | 1149 | lua_pushboolean(L1, luaL_newmetatable(L1, getstring)); |
| 1115 | } | 1150 | } |
| 1116 | else if EQ("testudata") { | 1151 | else if EQ("testudata") { |
| 1117 | int i = getindex; | 1152 | int i = getindex; |
| 1118 | lua_pushboolean(L1, luaL_testudata(L1, i, getname) != NULL); | 1153 | lua_pushboolean(L1, luaL_testudata(L1, i, getstring) != NULL); |
| 1119 | } | 1154 | } |
| 1120 | else if EQ("gsub") { | 1155 | else if EQ("gsub") { |
| 1121 | int a = getnum; int b = getnum; int c = getnum; | 1156 | int a = getnum; int b = getnum; int c = getnum; |
| 1122 | luaL_gsub(L1, lua_tostring(L1, a), | 1157 | luaL_gsub(L1, lua_tostring(L1, a), |
| 1123 | lua_tostring(L, b), | 1158 | lua_tostring(L1, b), |
| 1124 | lua_tostring(L, c)); | 1159 | lua_tostring(L1, c)); |
| 1125 | } | 1160 | } |
| 1126 | else if EQ("sethook") { | 1161 | else if EQ("sethook") { |
| 1127 | int mask = getnum; | 1162 | int mask = getnum; |
| 1128 | int count = getnum; | 1163 | int count = getnum; |
| 1129 | sethookaux(L1, mask, count, getname); | 1164 | sethookaux(L1, mask, count, getstring); |
| 1130 | } | 1165 | } |
| 1131 | else if EQ("throw") { | 1166 | else if EQ("throw") { |
| 1132 | #if defined(__cplusplus) | 1167 | #if defined(__cplusplus) |
