File: trace.c

package info (click to toggle)
lua50 5.0.3-8.1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,228 kB
  • sloc: ansic: 12,032; makefile: 310; sh: 20
file content (55 lines) | stat: -rw-r--r-- 1,112 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
* trace.c -- a simple execution tracer for Lua
*/

#include <stdio.h>
#include <string.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

static FILE* LOG;		/* log file */
static int I=0;			/* indentation level */

static void hook(lua_State *L, lua_Debug *ar)
{
 const char* s="";
 switch (ar->event)
 {
  case LUA_HOOKTAILRET: ar->event=LUA_HOOKRET;
  case LUA_HOOKRET: s="return"; break;
  case LUA_HOOKCALL: s="call"; break;
  case LUA_HOOKLINE: s="line"; break;
  default: break;
 }
 fprintf(LOG,"[%d]\t%*s%s\t-- %d\n",I,I,"",s,ar->currentline);
 if (ar->event==LUA_HOOKCALL) ++I; else if (ar->event==LUA_HOOKRET) --I;
}

static void start_trace(lua_State *L, FILE* logfile)
{
 lua_sethook(L,hook,LUA_MASKCALL | LUA_MASKRET | LUA_MASKLINE, 0);
 LOG=logfile;
}

static void stop_trace(lua_State *L)
{
 lua_sethook(L,NULL,0,0);
 fclose(LOG);
}

int main(void)
{
 int rc;
 lua_State *L=lua_open();
 lua_baselibopen(L);
 lua_tablibopen(L);
 lua_iolibopen(L);
 lua_strlibopen(L);
 lua_mathlibopen(L);
 lua_dblibopen(L);
 start_trace(L,stderr);
 rc=lua_dofile(L,NULL);
 stop_trace(L);
 return rc;
}