diff --git a/func.h b/func.h index 8d2d124d..56066a47 100644 --- 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 index 6a42266b..0717c8ab 100644 --- 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 #include @@ -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 index fee22d15..c3139a52 100644 --- 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 index 9bb5b1f4..ed839466 100644 --- 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 #include @@ -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); + $$ = 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 = $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")); + $$ = 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 = $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 index 97eb3ea5..5b5d7601 100644 --- 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 #include @@ -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 index 3af5597f..913000a2 100644 --- 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 index fc3d753c..2cf103c4 100644 --- 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 @@ -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; its.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; } @@ -199,71 +196,40 @@ 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 index 3cab37ed..d0093dad 100644 --- 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