diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-01-08 14:47:44 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-01-08 14:47:44 -0200 |
| commit | 01772cefa5217a7840254d1e7ec340dea8f0747a (patch) | |
| tree | 01fcf83242542a8ad171a358994b7c4c0cc835dd | |
| parent | dc90d4bce340f987a5048c17699a653f47360711 (diff) | |
| download | lua-01772cefa5217a7840254d1e7ec340dea8f0747a.tar.gz lua-01772cefa5217a7840254d1e7ec340dea8f0747a.tar.bz2 lua-01772cefa5217a7840254d1e7ec340dea8f0747a.zip | |
new library for debbuging
| -rw-r--r-- | ldblib.c | 213 | ||||
| -rw-r--r-- | lua.c | 9 | ||||
| -rw-r--r-- | lualib.h | 5 | ||||
| -rw-r--r-- | makefile | 12 |
4 files changed, 228 insertions, 11 deletions
diff --git a/ldblib.c b/ldblib.c new file mode 100644 index 00000000..952f3cb3 --- /dev/null +++ b/ldblib.c | |||
| @@ -0,0 +1,213 @@ | |||
| 1 | /* | ||
| 2 | ** $Id: $ | ||
| 3 | ** Interface from Lua to its debug API | ||
| 4 | ** See Copyright Notice in lua.h | ||
| 5 | */ | ||
| 6 | |||
| 7 | |||
| 8 | #include <stdlib.h> | ||
| 9 | #include <string.h> | ||
| 10 | |||
| 11 | #include "lauxlib.h" | ||
| 12 | #include "lua.h" | ||
| 13 | #include "luadebug.h" | ||
| 14 | |||
| 15 | |||
| 16 | |||
| 17 | static void settabss (lua_Object t, char *i, char *v) { | ||
| 18 | lua_pushobject(t); | ||
| 19 | lua_pushstring(i); | ||
| 20 | lua_pushstring(v); | ||
| 21 | lua_settable(); | ||
| 22 | } | ||
| 23 | |||
| 24 | |||
| 25 | static void settabsi (lua_Object t, char *i, int v) { | ||
| 26 | lua_pushobject(t); | ||
| 27 | lua_pushstring(i); | ||
| 28 | lua_pushnumber(v); | ||
| 29 | lua_settable(); | ||
| 30 | } | ||
| 31 | |||
| 32 | |||
| 33 | static lua_Object getfuncinfo (lua_Object func) { | ||
| 34 | lua_Object result = lua_createtable(); | ||
| 35 | char *name; | ||
| 36 | int line; | ||
| 37 | lua_funcinfo(func, &name, &line); | ||
| 38 | if (line == -1) /* C function? */ | ||
| 39 | settabss(result, "kind", "C"); | ||
| 40 | else if (line == 0) { /* "main"? */ | ||
| 41 | settabss(result, "kind", "chunk"); | ||
| 42 | settabss(result, "name", name); | ||
| 43 | } | ||
| 44 | else { /* Lua function */ | ||
| 45 | settabss(result, "kind", "Lua"); | ||
| 46 | settabsi(result, "def_line", line); | ||
| 47 | settabss(result, "def_chunk", name); | ||
| 48 | } | ||
| 49 | if (line != 0) { /* is it not a "main"? */ | ||
| 50 | char *kind = lua_getobjname(func, &name); | ||
| 51 | if (*kind) { | ||
| 52 | settabss(result, "name", name); | ||
| 53 | settabss(result, "where", kind); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | return result; | ||
| 57 | } | ||
| 58 | |||
| 59 | |||
| 60 | static void getstack (void) { | ||
| 61 | lua_Object func = lua_stackedfunction(luaL_check_int(1)); | ||
| 62 | if (func == LUA_NOOBJECT) /* level out of range? */ | ||
| 63 | return; | ||
| 64 | else { | ||
| 65 | lua_Object result = getfuncinfo(func); | ||
| 66 | int currline = lua_currentline(func); | ||
| 67 | if (currline > 0) | ||
| 68 | settabsi(result, "current", currline); | ||
| 69 | lua_pushobject(result); | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | |||
| 74 | static void funcinfo (void) { | ||
| 75 | lua_pushobject(getfuncinfo(luaL_functionarg(1))); | ||
| 76 | } | ||
| 77 | |||
| 78 | |||
| 79 | static int findlocal (lua_Object func, int arg) { | ||
| 80 | lua_Object v = lua_getparam(arg); | ||
| 81 | if (lua_isnumber(v)) | ||
| 82 | return (int)lua_getnumber(v); | ||
| 83 | else { | ||
| 84 | char *name = luaL_check_string(arg); | ||
| 85 | int i = 0; | ||
| 86 | int result = -1; | ||
| 87 | char *vname; | ||
| 88 | while (lua_getlocal(func, ++i, &vname) != LUA_NOOBJECT) { | ||
| 89 | if (strcmp(name, vname) == 0) | ||
| 90 | result = i; /* keep looping to get the last var with this name */ | ||
| 91 | } | ||
| 92 | if (result == -1) | ||
| 93 | luaL_verror("no local variable `%.50s' at given level", name); | ||
| 94 | return result; | ||
| 95 | } | ||
| 96 | } | ||
| 97 | |||
| 98 | |||
| 99 | static void getlocal (void) { | ||
| 100 | lua_Object func = lua_stackedfunction(luaL_check_int(1)); | ||
| 101 | lua_Object val; | ||
| 102 | char *name; | ||
| 103 | if (func == LUA_NOOBJECT) /* level out of range? */ | ||
| 104 | return; /* return nil */ | ||
| 105 | else if (lua_getparam(2) != LUA_NOOBJECT) { /* 2nd argument? */ | ||
| 106 | if ((val = lua_getlocal(func, findlocal(func, 2), &name)) != LUA_NOOBJECT) { | ||
| 107 | lua_pushobject(val); | ||
| 108 | lua_pushstring(name); | ||
| 109 | } | ||
| 110 | /* else return nil */ | ||
| 111 | } | ||
| 112 | else { /* collect all locals in a table */ | ||
| 113 | lua_Object result = lua_createtable(); | ||
| 114 | int i; | ||
| 115 | for (i=1; ;i++) { | ||
| 116 | if ((val = lua_getlocal(func, i, &name)) == LUA_NOOBJECT) | ||
| 117 | break; | ||
| 118 | lua_pushobject(result); | ||
| 119 | lua_pushstring(name); | ||
| 120 | lua_pushobject(val); | ||
| 121 | lua_settable(); /* result[name] = value */ | ||
| 122 | } | ||
| 123 | lua_pushobject(result); | ||
| 124 | } | ||
| 125 | } | ||
| 126 | |||
| 127 | |||
| 128 | static void setlocal (void) { | ||
| 129 | lua_Object func = lua_stackedfunction(luaL_check_int(1)); | ||
| 130 | int numvar; | ||
| 131 | luaL_arg_check(func != LUA_NOOBJECT, 1, "level out of range"); | ||
| 132 | numvar = findlocal(func, 2); | ||
| 133 | lua_pushobject(luaL_nonnullarg(3)); | ||
| 134 | if (!lua_setlocal(func, numvar)) | ||
| 135 | lua_error("no such local variable"); | ||
| 136 | } | ||
| 137 | |||
| 138 | |||
| 139 | |||
| 140 | static int linehook = -1; /* Lua reference to line hook function */ | ||
| 141 | static int callhook = -1; /* Lua reference to call hook function */ | ||
| 142 | |||
| 143 | |||
| 144 | static void dohook (int ref) { | ||
| 145 | lua_LHFunction oldlinehook = lua_linehook; /* save old hooks */ | ||
| 146 | lua_CHFunction oldcallhook = lua_callhook; | ||
| 147 | lua_linehook = NULL; lua_callhook = NULL; /* to avoid recusive calls */ | ||
| 148 | lua_callfunction(lua_getref(ref)); | ||
| 149 | lua_linehook = oldlinehook; /* restore old hooks */ | ||
| 150 | lua_callhook = oldcallhook; | ||
| 151 | } | ||
| 152 | |||
| 153 | |||
| 154 | static void linef (int line) { | ||
| 155 | lua_pushnumber(line); | ||
| 156 | dohook(linehook); | ||
| 157 | } | ||
| 158 | |||
| 159 | |||
| 160 | static void callf (lua_Function func, char *file, int line) { | ||
| 161 | if (func != LUA_NOOBJECT) { | ||
| 162 | lua_pushobject(func); | ||
| 163 | lua_pushstring(file); | ||
| 164 | lua_pushnumber(line); | ||
| 165 | } | ||
| 166 | dohook(callhook); | ||
| 167 | } | ||
| 168 | |||
| 169 | |||
| 170 | static void setcallhook (void) { | ||
| 171 | lua_Object f = lua_getparam(1); | ||
| 172 | lua_unref(callhook); | ||
| 173 | if (f == LUA_NOOBJECT) { | ||
| 174 | callhook = -1; | ||
| 175 | lua_callhook = NULL; | ||
| 176 | } | ||
| 177 | else { | ||
| 178 | lua_pushobject(f); | ||
| 179 | callhook = lua_ref(1); | ||
| 180 | lua_callhook = callf; | ||
| 181 | } | ||
| 182 | } | ||
| 183 | |||
| 184 | |||
| 185 | static void setlinehook (void) { | ||
| 186 | lua_Object f = lua_getparam(1); | ||
| 187 | lua_unref(linehook); | ||
| 188 | if (f == LUA_NOOBJECT) { | ||
| 189 | linehook = -1; | ||
| 190 | lua_linehook = NULL; | ||
| 191 | } | ||
| 192 | else { | ||
| 193 | lua_pushobject(f); | ||
| 194 | linehook = lua_ref(1); | ||
| 195 | lua_linehook = linef; | ||
| 196 | } | ||
| 197 | } | ||
| 198 | |||
| 199 | |||
| 200 | static struct luaL_reg dblib[] = { | ||
| 201 | {"funcinfo", funcinfo}, | ||
| 202 | {"getlocal", getlocal}, | ||
| 203 | {"getstack", getstack}, | ||
| 204 | {"setcallhook", setcallhook}, | ||
| 205 | {"setlinehook", setlinehook}, | ||
| 206 | {"setlocal", setlocal} | ||
| 207 | }; | ||
| 208 | |||
| 209 | |||
| 210 | void lua_dblibopen (void) { | ||
| 211 | luaL_openlib(dblib, (sizeof(dblib)/sizeof(dblib[0]))); | ||
| 212 | } | ||
| 213 | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.c,v 1.15 1998/12/28 13:44:54 roberto Exp $ | 2 | ** $Id: lua.c,v 1.16 1999/01/06 13:12:41 roberto Exp roberto $ |
| 3 | ** Lua stand-alone interpreter | 3 | ** Lua stand-alone interpreter |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -131,11 +131,10 @@ static void manual_input (int prompt) { | |||
| 131 | int main (int argc, char *argv[]) | 131 | int main (int argc, char *argv[]) |
| 132 | { | 132 | { |
| 133 | int i; | 133 | int i; |
| 134 | setlocale(LC_ALL, ""); | 134 | lua_open(); |
| 135 | lua_iolibopen(); | ||
| 136 | lua_strlibopen(); | ||
| 137 | lua_mathlibopen(); | ||
| 138 | lua_pushstring("> "); lua_setglobal("_PROMPT"); | 135 | lua_pushstring("> "); lua_setglobal("_PROMPT"); |
| 136 | lua_userinit(); | ||
| 137 | setlocale(LC_ALL, ""); | ||
| 139 | if (argc < 2) { /* no arguments? */ | 138 | if (argc < 2) { /* no arguments? */ |
| 140 | if (isatty(0)) { | 139 | if (isatty(0)) { |
| 141 | printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT); | 140 | printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lualib.h,v 1.3 1997/12/17 20:48:58 roberto Exp roberto $ | 2 | ** $Id: lualib.h,v 1.4 1998/06/19 16:14:09 roberto Exp roberto $ |
| 3 | ** Lua standard libraries | 3 | ** Lua standard libraries |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -10,12 +10,13 @@ | |||
| 10 | 10 | ||
| 11 | #include "lua.h" | 11 | #include "lua.h" |
| 12 | 12 | ||
| 13 | |||
| 14 | void lua_iolibopen (void); | 13 | void lua_iolibopen (void); |
| 15 | void lua_strlibopen (void); | 14 | void lua_strlibopen (void); |
| 16 | void lua_mathlibopen (void); | 15 | void lua_mathlibopen (void); |
| 16 | void lua_dblibopen (void); | ||
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | void lua_userinit (void); | ||
| 19 | 20 | ||
| 20 | 21 | ||
| 21 | /* To keep compatibility with old versions */ | 22 | /* To keep compatibility with old versions */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | # | 1 | # |
| 2 | ## $Id: makefile,v 1.12 1998/05/27 13:03:40 roberto Exp roberto $ | 2 | ## $Id: makefile,v 1.13 1998/06/19 18:52:27 roberto Exp roberto $ |
| 3 | ## Makefile | 3 | ## Makefile |
| 4 | ## See Copyright Notice in lua.h | 4 | ## See Copyright Notice in lua.h |
| 5 | # | 5 | # |
| @@ -58,7 +58,9 @@ LUAOBJS = \ | |||
| 58 | LIBOBJS = \ | 58 | LIBOBJS = \ |
| 59 | liolib.o \ | 59 | liolib.o \ |
| 60 | lmathlib.o \ | 60 | lmathlib.o \ |
| 61 | lstrlib.o | 61 | lstrlib.o \ |
| 62 | ldblib.o \ | ||
| 63 | linit.o | ||
| 62 | 64 | ||
| 63 | 65 | ||
| 64 | lua : lua.o liblua.a liblualib.a | 66 | lua : lua.o liblua.a liblualib.a |
| @@ -96,12 +98,14 @@ lauxlib.o: lauxlib.c lauxlib.h lua.h luadebug.h | |||
| 96 | lbuffer.o: lbuffer.c lauxlib.h lua.h lmem.h lstate.h lobject.h | 98 | lbuffer.o: lbuffer.c lauxlib.h lua.h lmem.h lstate.h lobject.h |
| 97 | lbuiltin.o: lbuiltin.c lapi.h lua.h lobject.h lauxlib.h lbuiltin.h \ | 99 | lbuiltin.o: lbuiltin.c lapi.h lua.h lobject.h lauxlib.h lbuiltin.h \ |
| 98 | ldo.h lstate.h lfunc.h lmem.h lstring.h ltable.h ltm.h lundump.h \ | 100 | ldo.h lstate.h lfunc.h lmem.h lstring.h ltable.h ltm.h lundump.h \ |
| 99 | lzio.h | 101 | lzio.h lvm.h |
| 102 | ldblib.o: ldblib.c lauxlib.h lua.h luadebug.h | ||
| 100 | ldo.o: ldo.c ldo.h lobject.h lua.h lstate.h lfunc.h lgc.h lmem.h \ | 103 | ldo.o: ldo.c ldo.h lobject.h lua.h lstate.h lfunc.h lgc.h lmem.h \ |
| 101 | lparser.h lzio.h ltm.h luadebug.h lundump.h lvm.h | 104 | lparser.h lzio.h lstring.h ltm.h luadebug.h lundump.h lvm.h |
| 102 | lfunc.o: lfunc.c lfunc.h lobject.h lua.h lmem.h lstate.h | 105 | lfunc.o: lfunc.c lfunc.h lobject.h lua.h lmem.h lstate.h |
| 103 | lgc.o: lgc.c ldo.h lobject.h lua.h lstate.h lfunc.h lgc.h lmem.h \ | 106 | lgc.o: lgc.c ldo.h lobject.h lua.h lstate.h lfunc.h lgc.h lmem.h \ |
| 104 | lstring.h ltable.h ltm.h | 107 | lstring.h ltable.h ltm.h |
| 108 | linit.o: linit.c lua.h lualib.h | ||
| 105 | liolib.o: liolib.c lauxlib.h lua.h luadebug.h lualib.h | 109 | liolib.o: liolib.c lauxlib.h lua.h luadebug.h lualib.h |
| 106 | llex.o: llex.c lauxlib.h lua.h llex.h lobject.h lzio.h lmem.h \ | 110 | llex.o: llex.c lauxlib.h lua.h llex.h lobject.h lzio.h lmem.h \ |
| 107 | lparser.h lstate.h lstring.h luadebug.h | 111 | lparser.h lstate.h lstring.h luadebug.h |
