diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-01-09 18:22:44 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-01-09 18:22:44 -0200 |
commit | b2afc410fa395900a0e620cfa7abc73754ac974f (patch) | |
tree | 7c84cdcdf09fc86ec0582c93835c1863aa7e4b31 | |
parent | 19cfa3239399d6d382cfdda3da8f50396630849a (diff) | |
download | lua-b2afc410fa395900a0e620cfa7abc73754ac974f.tar.gz lua-b2afc410fa395900a0e620cfa7abc73754ac974f.tar.bz2 lua-b2afc410fa395900a0e620cfa7abc73754ac974f.zip |
hooks for line change and function calls; first version.
-rw-r--r-- | luadebug.h | 10 | ||||
-rw-r--r-- | opcode.c | 88 |
2 files changed, 88 insertions, 10 deletions
@@ -2,7 +2,7 @@ | |||
2 | ** LUA - Linguagem para Usuarios de Aplicacao | 2 | ** LUA - Linguagem para Usuarios de Aplicacao |
3 | ** Grupo de Tecnologia em Computacao Grafica | 3 | ** Grupo de Tecnologia em Computacao Grafica |
4 | ** TeCGraf - PUC-Rio | 4 | ** TeCGraf - PUC-Rio |
5 | ** $Id: luadebug.h,v 1.1 1995/10/17 14:12:45 roberto Exp roberto $ | 5 | ** $Id: luadebug.h,v 1.2 1995/10/26 14:21:56 roberto Exp $ |
6 | */ | 6 | */ |
7 | 7 | ||
8 | 8 | ||
@@ -11,10 +11,14 @@ | |||
11 | 11 | ||
12 | #include "lua.h" | 12 | #include "lua.h" |
13 | 13 | ||
14 | typedef void (*lua_LHFunction) (int line); | ||
15 | typedef void (*lua_CHFunction) (lua_Object func, char *file, int line); | ||
16 | |||
14 | lua_Object lua_stackedfunction(int level); | 17 | lua_Object lua_stackedfunction(int level); |
15 | void lua_funcinfo (lua_Object func, char **filename, int *linedefined); | 18 | void lua_funcinfo (lua_Object func, char **filename, int *linedefined); |
16 | int lua_currentline (lua_Object func); | 19 | int lua_currentline (lua_Object func); |
17 | char *getobjname (lua_Object o, char **name); | 20 | char *lua_getobjname (lua_Object o, char **name); |
18 | 21 | lua_LHFunction lua_setlinehook (lua_LHFunction hook); | |
22 | lua_CHFunction lua_setcallhook (lua_CHFunction hook); | ||
19 | 23 | ||
20 | #endif | 24 | #endif |
@@ -3,7 +3,7 @@ | |||
3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
4 | */ | 4 | */ |
5 | 5 | ||
6 | char *rcs_opcode="$Id: opcode.c,v 3.50 1995/11/16 20:46:24 roberto Exp roberto $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 3.50 1995/11/16 20:46:24 roberto Exp $"; |
7 | 7 | ||
8 | #include <setjmp.h> | 8 | #include <setjmp.h> |
9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
@@ -53,6 +53,11 @@ static int CnResults = 0; /* when Lua calls C, has the number of parameters; */ | |||
53 | static jmp_buf *errorJmp = NULL; /* current error recover point */ | 53 | static jmp_buf *errorJmp = NULL; /* current error recover point */ |
54 | 54 | ||
55 | 55 | ||
56 | /* Hooks */ | ||
57 | static lua_LHFunction line_hook = NULL; | ||
58 | static lua_CHFunction call_hook = NULL; | ||
59 | |||
60 | |||
56 | static StkId lua_execute (Byte *pc, StkId base); | 61 | static StkId lua_execute (Byte *pc, StkId base); |
57 | static void do_call (StkId base, int nResults); | 62 | static void do_call (StkId base, int nResults); |
58 | 63 | ||
@@ -64,6 +69,23 @@ Object *luaI_Address (lua_Object o) | |||
64 | } | 69 | } |
65 | 70 | ||
66 | 71 | ||
72 | /* | ||
73 | ** Functions to change hook functions. | ||
74 | */ | ||
75 | lua_LHFunction lua_setlinehook (lua_LHFunction hook) | ||
76 | { | ||
77 | lua_LHFunction temp = line_hook; | ||
78 | line_hook = hook; | ||
79 | return temp; | ||
80 | } | ||
81 | |||
82 | lua_CHFunction lua_setcallhook (lua_CHFunction hook) | ||
83 | { | ||
84 | lua_CHFunction temp = call_hook; | ||
85 | call_hook = hook; | ||
86 | return temp; | ||
87 | } | ||
88 | |||
67 | 89 | ||
68 | /* | 90 | /* |
69 | ** Init stack | 91 | ** Init stack |
@@ -193,6 +215,48 @@ static void open_stack (int nelems) | |||
193 | 215 | ||
194 | 216 | ||
195 | /* | 217 | /* |
218 | ** call Line hook | ||
219 | */ | ||
220 | static void lineHook (int line) | ||
221 | { | ||
222 | StkId oldBase = CBase; | ||
223 | int oldCnResults = CnResults; | ||
224 | StkId old_top = CBase = top-stack; | ||
225 | CnResults = 0; | ||
226 | (*line_hook)(line); | ||
227 | top = stack+old_top; | ||
228 | CnResults = oldCnResults; | ||
229 | CBase = oldBase; | ||
230 | } | ||
231 | |||
232 | |||
233 | /* | ||
234 | ** Call hook | ||
235 | ** The function being called is in [stack+base-1] | ||
236 | */ | ||
237 | static void callHook (StkId base, lua_Type type, int isreturn) | ||
238 | { | ||
239 | StkId oldBase = CBase; | ||
240 | int oldCnResults = CnResults; | ||
241 | StkId old_top = CBase = top-stack; | ||
242 | CnResults = 0; | ||
243 | if (isreturn) | ||
244 | (*call_hook)(LUA_NOOBJECT, "(return)", 0); | ||
245 | else | ||
246 | { | ||
247 | Object *f = stack+base-1; | ||
248 | if (type == LUA_T_MARK) | ||
249 | (*call_hook)(Ref(f), f->value.tf->fileName, f->value.tf->lineDefined); | ||
250 | else | ||
251 | (*call_hook)(Ref(f), "(C)", -1); | ||
252 | } | ||
253 | top = stack+old_top; | ||
254 | CnResults = oldCnResults; | ||
255 | CBase = oldBase; | ||
256 | } | ||
257 | |||
258 | |||
259 | /* | ||
196 | ** Call a C function. CBase will point to the top of the stack, | 260 | ** Call a C function. CBase will point to the top of the stack, |
197 | ** and CnResults is the number of parameters. Returns an index | 261 | ** and CnResults is the number of parameters. Returns an index |
198 | ** to the first result from C. | 262 | ** to the first result from C. |
@@ -204,8 +268,15 @@ static StkId callC (lua_CFunction func, StkId base) | |||
204 | StkId firstResult; | 268 | StkId firstResult; |
205 | CnResults = (top-stack) - base; | 269 | CnResults = (top-stack) - base; |
206 | /* incorporate parameters on the stack */ | 270 | /* incorporate parameters on the stack */ |
207 | CBase = base+CnResults; | 271 | CBase = base+CnResults; /* == top-stack */ |
208 | (*func)(); | 272 | if (call_hook) |
273 | { | ||
274 | callHook (base, LUA_T_CMARK, 0); | ||
275 | (*func)(); | ||
276 | callHook (base, LUA_T_CMARK, 1); | ||
277 | } | ||
278 | else | ||
279 | (*func)(); | ||
209 | firstResult = CBase; | 280 | firstResult = CBase; |
210 | CBase = oldBase; | 281 | CBase = oldBase; |
211 | CnResults = oldCnResults; | 282 | CnResults = oldCnResults; |
@@ -784,6 +855,8 @@ static void comparison (lua_Type tag_less, lua_Type tag_equal, | |||
784 | */ | 855 | */ |
785 | static StkId lua_execute (Byte *pc, StkId base) | 856 | static StkId lua_execute (Byte *pc, StkId base) |
786 | { | 857 | { |
858 | if (call_hook) | ||
859 | callHook (base, LUA_T_MARK, 0); | ||
787 | while (1) | 860 | while (1) |
788 | { | 861 | { |
789 | OpCode opcode; | 862 | OpCode opcode; |
@@ -1144,10 +1217,10 @@ static StkId lua_execute (Byte *pc, StkId base) | |||
1144 | break; | 1217 | break; |
1145 | 1218 | ||
1146 | case RETCODE0: | 1219 | case RETCODE0: |
1147 | return base; | ||
1148 | |||
1149 | case RETCODE: | 1220 | case RETCODE: |
1150 | return base+*pc; | 1221 | if (call_hook) |
1222 | callHook (base, LUA_T_MARK, 1); | ||
1223 | return (base + ((opcode==RETCODE0) ? 0 : *pc)); | ||
1151 | 1224 | ||
1152 | case SETLINE: | 1225 | case SETLINE: |
1153 | { | 1226 | { |
@@ -1161,6 +1234,8 @@ static StkId lua_execute (Byte *pc, StkId base) | |||
1161 | (stack+base-1)->tag = LUA_T_LINE; | 1234 | (stack+base-1)->tag = LUA_T_LINE; |
1162 | } | 1235 | } |
1163 | (stack+base-1)->value.i = code.w; | 1236 | (stack+base-1)->value.i = code.w; |
1237 | if (line_hook) | ||
1238 | lineHook (code.w); | ||
1164 | break; | 1239 | break; |
1165 | } | 1240 | } |
1166 | 1241 | ||
@@ -1170,4 +1245,3 @@ static StkId lua_execute (Byte *pc, StkId base) | |||
1170 | } | 1245 | } |
1171 | } | 1246 | } |
1172 | 1247 | ||
1173 | |||