commit 2cffb08a5c770678999a313a83c76652a3d02d4c
parent 15f40fddca66301a53f8b0adf41958c7e9add945
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Tue, 17 Oct 1995 09:58:22 -0200
new style for debug information about functions: no more SETFUNCTION
opcodes. When a function is called, its entry in the stack is marked with
LUA_T_(C)MARK, so function 'luaD_stackedfunction' can find it if
needed.
Functions now have their file names in the headers, so there is no need
of 'addfile' and the like.
Diffstat:
M | func.h | | | 4 | ++++ |
M | inout.c | | | 109 | +++++++------------------------------------------------------------------------ |
M | inout.h | | | 9 | +++------ |
M | lua.stx | | | 35 | +++++++++++++---------------------- |
M | opcode.c | | | 59 | ++++++++++++++++++++++++++++++++++------------------------- |
M | opcode.h | | | 6 | ++---- |
M | table.c | | | 102 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
M | table.h | | | 11 | +++++------ |
8 files changed, 121 insertions(+), 214 deletions(-)
diff --git a/func.h b/func.h
@@ -12,6 +12,10 @@ typedef struct TFunc
char marked;
int size;
Byte *code;
+ int lineDefined;
+ char *name1; /* function or method name (or null if main) */
+ char *name2; /* object name (or null if not method) */
+ char *fileName;
} TFunc;
Long luaI_funccollector (void);
diff --git a/inout.c b/inout.c
@@ -5,7 +5,7 @@
** Also provides some predefined lua functions.
*/
-char *rcs_inout="$Id: inout.c,v 2.21 1995/10/04 14:20:26 roberto Exp roberto $";
+char *rcs_inout="$Id: inout.c,v 2.22 1995/10/09 13:06:20 roberto Exp roberto $";
#include <stdio.h>
#include <stdlib.h>
@@ -31,20 +31,9 @@ char *rcs_inout="$Id: inout.c,v 2.21 1995/10/04 14:20:26 roberto Exp roberto $";
Word lua_linenumber;
Bool lua_debug;
Word lua_debugline = 0;
+char *lua_parsedfile;
-/* Internal variables */
-
-typedef struct FuncStackNode {
- struct FuncStackNode *next;
- char *file;
- Word function;
- Word line;
-} FuncStackNode;
-
-static FuncStackNode *funcStack = NULL;
-static Word nfuncstack=0;
-
static FILE *fp;
static char *st;
@@ -70,16 +59,17 @@ static int stringinput (void)
*/
char *lua_openfile (char *fn)
{
- lua_linenumber = 1;
lua_setinput (fileinput);
fp = fopen (fn, "r");
if (fp == NULL)
{
static char buff[255];
- sprintf(buff, "unable to open file %.230s", fn);
+ sprintf(buff, "unable to open file `%.200s'", fn);
return buff;
}
- return lua_addfile (fn);
+ lua_linenumber = 1;
+ lua_parsedfile = lua_constcreate(fn)->ts.str;
+ return NULL;
}
/*
@@ -89,7 +79,6 @@ void lua_closefile (void)
{
if (fp != NULL)
{
- lua_delfile();
fclose (fp);
fp = NULL;
}
@@ -98,16 +87,12 @@ void lua_closefile (void)
/*
** Function to open a string to be input unit
*/
-char *lua_openstring (char *s)
+void lua_openstring (char *s)
{
- lua_linenumber = 1;
lua_setinput (stringinput);
st = s;
- {
- char sn[64];
- sprintf (sn, "String: %10.10s...", s);
- return lua_addfile (sn);
- }
+ lua_linenumber = 1;
+ lua_parsedfile = lua_constcreate("(string)")->ts.str;
}
/*
@@ -115,75 +100,6 @@ char *lua_openstring (char *s)
*/
void lua_closestring (void)
{
- lua_delfile();
-}
-
-
-/*
-** Called to execute SETFUNCTION opcode, this function pushs a function into
-** function stack.
-*/
-void lua_pushfunction (char *file, Word function)
-{
- FuncStackNode *newNode;
- if (nfuncstack++ >= MAXFUNCSTACK)
- {
- lua_error("function stack overflow");
- }
- newNode = new(FuncStackNode);
- newNode->function = function;
- newNode->file = file;
- newNode->line= lua_debugline;
- newNode->next = funcStack;
- funcStack = newNode;
-}
-
-/*
-** Called to execute RESET opcode, this function pops a function from
-** function stack.
-*/
-void lua_popfunction (void)
-{
- FuncStackNode *temp = funcStack;
- if (temp == NULL) return;
- --nfuncstack;
- lua_debugline = temp->line;
- funcStack = temp->next;
- luaI_free(temp);
-}
-
-/*
-** Report bug building a message and pushing it on the stack.
-*/
-void luaI_reportbug (char *s, int err)
-{
- char msg[MAXMESSAGE];
- strcpy (msg, s);
- if (lua_debugline != 0)
- {
- if (funcStack)
- {
- FuncStackNode *func = funcStack;
- int line = lua_debugline;
- sprintf (strchr(msg,0), "\n\tactive stack:\n");
- do
- {
- sprintf (strchr(msg,0),
- "\t-> function \"%s\" at file \"%s\":%u\n",
- lua_constant[func->function]->str, func->file, line);
- line = func->line;
- func = func->next;
- if (err) lua_popfunction();
- } while (func);
- }
- else
- {
- sprintf (strchr(msg,0),
- "\n\tin statement begining at line %u of file \"%s\"",
- lua_debugline, lua_filename());
- }
- }
- lua_pushstring(msg);
}
@@ -297,10 +213,3 @@ void luaI_error (void)
lua_error(s);
}
-void luaI_getstack (void)
-{
- char *s = lua_getstring(lua_getparam(1));
- if (s == NULL) s = "";
- luaI_reportbug(s, 0);
-}
-
diff --git a/inout.h b/inout.h
@@ -1,5 +1,5 @@
/*
-** $Id: inout.h,v 1.8 1995/05/02 18:43:03 roberto Exp roberto $
+** $Id: inout.h,v 1.9 1995/05/16 17:23:58 roberto Exp roberto $
*/
@@ -12,21 +12,18 @@
extern Word lua_linenumber;
extern Bool lua_debug;
extern Word lua_debugline;
+extern char *lua_parsedfile;
char *lua_openfile (char *fn);
void lua_closefile (void);
-char *lua_openstring (char *s);
+void lua_openstring (char *s);
void lua_closestring (void);
-void lua_pushfunction (char *file, Word function);
-void lua_popfunction (void);
-void luaI_reportbug (char *s, int err);
void lua_internaldofile (void);
void lua_internaldostring (void);
void lua_print (void);
void luaI_type (void);
void lua_obj2number (void);
-void luaI_getstack (void);
void luaI_error (void);
#endif
diff --git a/lua.stx b/lua.stx
@@ -1,6 +1,6 @@
%{
-char *rcs_luastx = "$Id: lua.stx,v 3.19 1995/06/08 19:47:28 roberto Exp $";
+char *rcs_luastx = "$Id: lua.stx,v 3.20 1995/10/04 14:20:26 roberto Exp roberto $";
#include <stdio.h>
#include <stdlib.h>
@@ -244,17 +244,10 @@ static void init_function (TreeNode *func)
}
pc=0; basepc=funcCode; maxcurr=maxcode;
nlocalvar=0;
- if (lua_debug)
- {
- code_byte(SETFUNCTION);
- code_code((TFunc *)luaI_strdup(lua_file[lua_nfile-1]));
- code_word(luaI_findconstant(func));
- }
}
static void codereturn (void)
{
- if (lua_debug) code_byte(RESET);
if (nlocalvar == 0)
code_byte(RETCODE0);
else
@@ -345,8 +338,8 @@ static void codeIf (Long thenAdd, Long elseAdd)
static void yyerror (char *s)
{
static char msg[256];
- sprintf (msg,"%s near \"%s\" at line %d in file \"%s\"",
- s, lua_lasttext (), lua_linenumber, lua_filename());
+ sprintf (msg,"%s near \"%s\" at line %d in file `%s'",
+ s, lua_lasttext (), lua_linenumber, lua_parsedfile);
lua_error (msg);
}
@@ -435,6 +428,7 @@ functionlist : /* empty */
function : FUNCTION NAME
{
init_function($2);
+ $<vInt>$ = lua_linenumber;
}
body
{
@@ -442,6 +436,10 @@ function : FUNCTION NAME
luaI_insertfunction($4); /* may take part in GC */
s_tag(func) = LUA_T_FUNCTION;
lua_table[func].object.value.tf = $4;
+ $4->lineDefined = $<vInt>3;
+ $4->name1 = $2->ts.str;
+ $4->name2 = NULL;
+ $4->fileName = lua_parsedfile;
}
;
@@ -449,6 +447,7 @@ method : FUNCTION NAME ':' NAME
{
init_function($4);
add_localvar(luaI_findsymbolbyname("self"));
+ $<vInt>$ = lua_linenumber;
}
body
{
@@ -462,6 +461,10 @@ method : FUNCTION NAME ':' NAME
code_code($6);
code_byte(STOREINDEXED0);
maincode=pc; *initcode=basepc; maxmain=maxcurr;
+ $6->lineDefined = $<vInt>5;
+ $6->name1 = $4->ts.str;
+ $6->name2 = $2->ts.str;
+ $6->fileName = lua_parsedfile;
}
;
@@ -966,17 +969,6 @@ static void PrintCode (Byte *code, Byte *end)
printf ("%d RETCODE %d\n", p-code, *(++p));
p++;
break;
- case SETFUNCTION:
- {
- CodeCode c1;
- CodeWord c2;
- int n = p-code;
- p++;
- get_code(c1,p);
- get_word(c2,p);
- printf ("%d SETFUNCTION %s %d\n", n, (char *)c1.tf, c2.w);
- }
- break;
case SETLINE:
{
CodeWord c;
@@ -987,7 +979,6 @@ static void PrintCode (Byte *code, Byte *end)
}
break;
- case RESET: printf ("%d RESET\n", (p++)-code); break;
default: printf ("%d Cannot happen: code %d\n", (p++)-code, *(p-1)); break;
}
}
diff --git a/opcode.c b/opcode.c
@@ -3,7 +3,7 @@
** TecCGraf - PUC-Rio
*/
-char *rcs_opcode="$Id: opcode.c,v 3.42 1995/10/09 18:45:59 roberto Exp roberto $";
+char *rcs_opcode="$Id: opcode.c,v 3.43 1995/10/13 15:16:25 roberto Exp roberto $";
#include <setjmp.h>
#include <stdlib.h>
@@ -248,9 +248,15 @@ static void do_call (StkId base, int nResults)
StkId firstResult;
Object *func = stack+base-1;
if (tag(func) == LUA_T_CFUNCTION)
+ {
+ tag(func) = LUA_T_CMARK;
firstResult = callC(fvalue(func), base);
+ }
else if (tag(func) == LUA_T_FUNCTION)
+ {
+ tag(func) = LUA_T_MARK;
firstResult = lua_execute(func->value.tf->code, base);
+ }
else
{ /* func is not a function */
call_funcFB(base, nResults);
@@ -313,21 +319,21 @@ static void storesubscript (void)
/*
** Traverse all objects on stack
*/
-void lua_travstack (void (*fn)(Object *))
+void lua_travstack (int (*fn)(Object *))
{
Object *o;
for (o = top-1; o >= stack; o--)
- fn (o);
+ fn (o);
}
/*
-** Error messages
+** Error messages and debug functions
*/
static void lua_message (char *s)
{
- luaI_reportbug(s, 1);
+ lua_pushstring(s);
callFB(FB_ERROR);
}
@@ -347,6 +353,25 @@ void lua_error (char *s)
}
+lua_Object luaD_stackedfunction (int level)
+{
+ Object *p = top;
+ while (--p >= stack)
+ if (p->tag == LUA_T_MARK || p->tag == LUA_T_CMARK)
+ if (level-- == 0)
+ return Ref(p);
+ return LUA_NOOBJECT;
+}
+
+
+void luaD_funcInfo (lua_Object func, char **filename, char **funcname,
+ char **objname, int *linedefined)
+{
+ return luaI_funcInfo(Address(func), filename, funcname, objname, linedefined);
+}
+
+
+
/*
** Execute a protected call. Assumes that function is at CBase and
** parameters are on top of it. Leave nResults on the stack.
@@ -386,6 +411,9 @@ static int do_protectedmain (void)
adjustC(1); /* one slot for the pseudo-function */
stack[CBase].tag = LUA_T_FUNCTION;
stack[CBase].value.tf = &tf;
+ tf.lineDefined = 0;
+ tf.name1 = tf.name2 = NULL;
+ tf.fileName = lua_parsedfile;
tf.code = NULL;
if (setjmp(myErrorJmp) == 0)
{
@@ -454,12 +482,7 @@ int lua_dofile (char *filename)
int lua_dostring (char *string)
{
int status;
- char *message = lua_openstring(string);
- if (message)
- {
- lua_message(message);
- return 1;
- }
+ lua_openstring(string);
status = do_protectedmain();
lua_closestring();
return status;
@@ -1138,16 +1161,6 @@ static StkId lua_execute (Byte *pc, StkId base)
case RETCODE:
return base+*pc;
- case SETFUNCTION:
- {
- CodeCode file;
- CodeWord func;
- get_code(file,pc);
- get_word(func,pc);
- lua_pushfunction ((char *)file.tf, func.w);
- }
- break;
-
case SETLINE:
{
CodeWord code;
@@ -1156,10 +1169,6 @@ static StkId lua_execute (Byte *pc, StkId base)
}
break;
- case RESET:
- lua_popfunction ();
- break;
-
default:
lua_error ("internal error - opcode doesn't match");
}
diff --git a/opcode.h b/opcode.h
@@ -1,6 +1,6 @@
/*
** TeCGraf - PUC-Rio
-** $Id: opcode.h,v 3.11 1995/04/11 17:56:30 celes Exp $
+** $Id: opcode.h,v 3.12 1995/10/04 17:13:02 roberto Exp roberto $
*/
#ifndef opcode_h
@@ -68,9 +68,7 @@ typedef enum
CALLFUNC,
RETCODE0,
RETCODE,
- SETFUNCTION,
SETLINE,
- RESET
} OpCode;
#define MULT_RET 255
@@ -149,7 +147,7 @@ void lua_setinput (Input fn); /* from "lex.c" module */
char *lua_lasttext (void); /* from "lex.c" module */
int yylex (void); /* from "lex.c" module */
void lua_parse (TFunc *tf); /* from "lua.stx" module */
-void lua_travstack (void (*fn)(Object *));
+void lua_travstack (int (*fn)(Object *));
Object *luaI_Address (lua_Object o);
void luaI_pushobject (Object *o);
void luaI_gcFB (Object *o);
diff --git a/table.c b/table.c
@@ -3,7 +3,7 @@
** Module to control static tables
*/
-char *rcs_table="$Id: table.c,v 2.33 1995/10/04 14:20:26 roberto Exp roberto $";
+char *rcs_table="$Id: table.c,v 2.34 1995/10/13 15:16:25 roberto Exp roberto $";
#include <string.h>
@@ -28,11 +28,6 @@ static Word lua_nconstant = 0;
static Long lua_maxconstant = 0;
-
-#define MAXFILE 20
-char *lua_file[MAXFILE];
-int lua_nfile;
-
#define GARBAGE_BLOCK 1024
#define MIN_GARBAGE_BLOCK (GARBAGE_BLOCK/2)
@@ -68,8 +63,6 @@ static void lua_initsymbol (void)
s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_internaldostring;
n = luaI_findsymbolbyname("setfallback");
s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_setfallback;
- n = luaI_findsymbolbyname("getstack");
- s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_getstack;
n = luaI_findsymbolbyname("error");
s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_error;
}
@@ -154,25 +147,29 @@ Word luaI_findconstantbyname (char *name)
/*
** Traverse symbol table objects
*/
-void lua_travsymbol (void (*fn)(Object *))
+static char *lua_travsymbol (int (*fn)(Object *))
{
Word i;
for (i=0; i<lua_ntable; i++)
- fn(&s_object(i));
+ if (fn(&s_object(i)))
+ return luaI_nodebysymbol(i)->ts.str;
+ return NULL;
}
/*
** Mark an object if it is a string or a unmarked array.
*/
-void lua_markobject (Object *o)
+int lua_markobject (Object *o)
{
if (tag(o) == LUA_T_STRING && !tsvalue(o)->marked)
tsvalue(o)->marked = 1;
else if (tag(o) == LUA_T_ARRAY)
lua_hashmark (avalue(o));
- else if (o->tag == LUA_T_FUNCTION && !o->value.tf->marked)
+ else if ((o->tag == LUA_T_FUNCTION || o->tag == LUA_T_MARK)
+ && !o->value.tf->marked)
o->value.tf->marked = 1;
+ return 0;
}
@@ -200,70 +197,39 @@ void lua_pack (void)
/*
-** Add a file name at file table, checking overflow. This function also set
-** the external variable "lua_filename" with the function filename set.
-** Return 0 on success or error message on error.
-*/
-char *lua_addfile (char *fn)
-{
- if (lua_nfile >= MAXFILE)
- return "too many files";
- if ((lua_file[lua_nfile++] = luaI_strdup (fn)) == NULL)
- return "not enough memory";
- return NULL;
-}
-
-/*
-** Delete a file from file stack
-*/
-int lua_delfile (void)
-{
- luaI_free(lua_file[--lua_nfile]);
- return 1;
-}
-
-/*
-** Return the last file name set.
-*/
-char *lua_filename (void)
-{
- return lua_file[lua_nfile-1];
-}
-
-/*
** Internal function: return next global variable
*/
static void lua_nextvar (void)
{
- char *varname;
- TreeNode *next;
+ Word next;
lua_Object o = lua_getparam(1);
if (o == LUA_NOOBJECT)
lua_error("too few arguments to function `nextvar'");
if (lua_getparam(2) != LUA_NOOBJECT)
lua_error("too many arguments to function `nextvar'");
if (lua_isnil(o))
- varname = NULL;
+ next = 0;
else if (!lua_isstring(o))
{
lua_error("incorrect argument to function `nextvar'");
return; /* to avoid warnings */
}
else
- varname = lua_getstring(o);
- next = lua_varnext(varname);
- if (next == NULL)
+ next = luaI_findsymbolbyname(lua_getstring(o)) + 1;
+ while (next < lua_ntable && s_tag(next) == LUA_T_NIL) next++;
+ if (next >= lua_ntable)
{
lua_pushnil();
lua_pushnil();
}
else
{
+ TreeNode *t = luaI_nodebysymbol(next);
Object name;
tag(&name) = LUA_T_STRING;
- tsvalue(&name) = &(next->ts);
+ tsvalue(&name) = &(t->ts);
luaI_pushobject(&name);
- luaI_pushobject(&s_object(next->varindex));
+ luaI_pushobject(&s_object(next));
}
}
@@ -286,3 +252,37 @@ static void getglobal (void)
lua_error("incorrect argument to function `getglobal'");
lua_pushobject(lua_getglobal(lua_getstring(name)));
}
+
+
+static lua_CFunction cfunc = NULL;
+static int checkfunc (Object *o)
+{
+ return ((o->tag == LUA_T_CMARK || o->tag == LUA_T_CFUNCTION) &&
+ o->value.f == cfunc);
+}
+
+
+void luaI_funcInfo (struct Object *func, char **filename, char **funcname,
+ char **objname, int *linedefined)
+{
+ if (func->tag == LUA_T_MARK || func->tag == LUA_T_FUNCTION)
+ {
+ TFunc *f = func->value.tf;
+ *filename = f->fileName;
+ *funcname = f->name1;
+ *objname = f->name2;
+ *linedefined = f->lineDefined;
+ }
+ else if (func->tag == LUA_T_CMARK || func->tag == LUA_T_CFUNCTION)
+ {
+ /* temporario: */
+ cfunc = func->value.f;
+ *filename = "(?)";
+ *objname = 0;
+ *linedefined = 0;
+ *funcname = lua_travsymbol(checkfunc);
+ if (*funcname == NULL)
+ *funcname = luaI_travfallbacks(checkfunc);
+ }
+}
+
diff --git a/table.h b/table.h
@@ -1,7 +1,7 @@
/*
** Module to control static tables
** TeCGraf - PUC-Rio
-** $Id: table.h,v 2.10 1994/12/20 21:20:36 roberto Exp roberto $
+** $Id: table.h,v 2.11 1995/10/13 15:16:25 roberto Exp roberto $
*/
#ifndef table_h
@@ -22,11 +22,10 @@ Word luaI_findsymbolbyname (char *name);
Word luaI_findsymbol (TreeNode *t);
Word luaI_findconstant (TreeNode *t);
Word luaI_findconstantbyname (char *name);
-void lua_travsymbol (void (*fn)(Object *));
-void lua_markobject (Object *o);
+int lua_markobject (Object *o);
void lua_pack (void);
-char *lua_addfile (char *fn);
-int lua_delfile (void);
-char *lua_filename (void);
+
+void luaI_funcInfo (Object *func, char **filename, char **funcname,
+ char **objname, int *linedefined);
#endif