debug interface functions to manipulated local variables:
"lua_getlocal" and "lua_setlocal".
This commit is contained in:
84
func.c
84
func.c
@@ -6,8 +6,23 @@
|
|||||||
#include "func.h"
|
#include "func.h"
|
||||||
#include "opcode.h"
|
#include "opcode.h"
|
||||||
|
|
||||||
static TFunc *function_root = NULL;
|
#define LOCALVARINITSIZE 10
|
||||||
|
|
||||||
|
static TFunc *function_root = NULL;
|
||||||
|
static LocVar *currvars = NULL;
|
||||||
|
static int numcurrvars = 0;
|
||||||
|
static int maxcurrvars = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Initialize TFunc struct
|
||||||
|
*/
|
||||||
|
void luaI_initTFunc (TFunc *f)
|
||||||
|
{
|
||||||
|
f->code = NULL;
|
||||||
|
f->lineDefined = 0;
|
||||||
|
f->locvars = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Insert function in list for GC
|
** Insert function in list for GC
|
||||||
@@ -77,3 +92,70 @@ void lua_funcinfo (lua_Object func, char **filename, int *linedefined)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Stores information to know that variable has been declared in given line
|
||||||
|
*/
|
||||||
|
void luaI_registerlocalvar (TreeNode *varname, int line)
|
||||||
|
{
|
||||||
|
if (numcurrvars >= maxcurrvars)
|
||||||
|
if (currvars == NULL)
|
||||||
|
{
|
||||||
|
maxcurrvars = LOCALVARINITSIZE;
|
||||||
|
currvars = newvector (maxcurrvars, LocVar);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxcurrvars *= 2;
|
||||||
|
currvars = growvector (currvars, maxcurrvars, LocVar);
|
||||||
|
}
|
||||||
|
currvars[numcurrvars].varname = varname;
|
||||||
|
currvars[numcurrvars].line = line;
|
||||||
|
numcurrvars++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Stores information to know that variable has been out of scope in given line
|
||||||
|
*/
|
||||||
|
void luaI_unregisterlocalvar (int line)
|
||||||
|
{
|
||||||
|
luaI_registerlocalvar(NULL, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copies "currvars" into a new area and store it in function header.
|
||||||
|
** The values (varname = NULL, line = -1) signal the end of vector.
|
||||||
|
*/
|
||||||
|
void luaI_closelocalvars (TFunc *func)
|
||||||
|
{
|
||||||
|
func->locvars = newvector (numcurrvars+1, LocVar);
|
||||||
|
memcpy (func->locvars, currvars, numcurrvars*sizeof(LocVar));
|
||||||
|
func->locvars[numcurrvars].varname = NULL;
|
||||||
|
func->locvars[numcurrvars].line = -1;
|
||||||
|
numcurrvars = 0; /* prepares for next function */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Look for n-esim local variable at line "line" in function "func".
|
||||||
|
** Returns NULL if not found.
|
||||||
|
*/
|
||||||
|
char *luaI_getlocalname (TFunc *func, int local_number, int line)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
char *varname = NULL;
|
||||||
|
LocVar *lv = func->locvars;
|
||||||
|
if (lv == NULL)
|
||||||
|
return NULL;
|
||||||
|
for (; lv->line != -1 && lv->line < line; lv++)
|
||||||
|
{
|
||||||
|
if (lv->varname) /* register */
|
||||||
|
{
|
||||||
|
if (++count == local_number)
|
||||||
|
varname = lv->varname->ts.str;
|
||||||
|
}
|
||||||
|
else /* unregister */
|
||||||
|
if (--count < local_number)
|
||||||
|
varname = NULL;
|
||||||
|
}
|
||||||
|
return varname;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
16
func.h
16
func.h
@@ -4,8 +4,15 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "lua.h"
|
#include "lua.h"
|
||||||
|
|
||||||
|
typedef struct LocVar
|
||||||
|
{
|
||||||
|
TreeNode *varname; /* NULL signals end of scope */
|
||||||
|
int line;
|
||||||
|
} LocVar;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Header para funcoes.
|
** Function Headers
|
||||||
*/
|
*/
|
||||||
typedef struct TFunc
|
typedef struct TFunc
|
||||||
{
|
{
|
||||||
@@ -15,10 +22,17 @@ typedef struct TFunc
|
|||||||
Byte *code;
|
Byte *code;
|
||||||
int lineDefined;
|
int lineDefined;
|
||||||
char *fileName;
|
char *fileName;
|
||||||
|
LocVar *locvars;
|
||||||
} TFunc;
|
} TFunc;
|
||||||
|
|
||||||
Long luaI_funccollector (void);
|
Long luaI_funccollector (void);
|
||||||
void luaI_insertfunction (TFunc *f);
|
void luaI_insertfunction (TFunc *f);
|
||||||
|
|
||||||
|
void luaI_initTFunc (TFunc *f);
|
||||||
|
|
||||||
|
void luaI_registerlocalvar (TreeNode *varname, int line);
|
||||||
|
void luaI_unregisterlocalvar (int line);
|
||||||
|
void luaI_closelocalvars (TFunc *func);
|
||||||
|
char *luaI_getlocalname (TFunc *func, int local_number, int line);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
30
lua.stx
30
lua.stx
@@ -1,11 +1,12 @@
|
|||||||
%{
|
%{
|
||||||
|
|
||||||
char *rcs_luastx = "$Id: lua.stx,v 3.27 1996/01/23 17:50:29 roberto Exp $";
|
char *rcs_luastx = "$Id: lua.stx,v 3.28 1996/02/05 13:26:01 roberto Exp roberto $";
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "luadebug.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "opcode.h"
|
#include "opcode.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
@@ -51,6 +52,7 @@ static int nlocalvar=0; /* number of local variables */
|
|||||||
static Word fields[MAXFIELDS]; /* fieldnames to be flushed */
|
static Word fields[MAXFIELDS]; /* fieldnames to be flushed */
|
||||||
static int nfields=0;
|
static int nfields=0;
|
||||||
|
|
||||||
|
int lua_debug = 0;
|
||||||
|
|
||||||
/* Internal functions */
|
/* Internal functions */
|
||||||
|
|
||||||
@@ -149,20 +151,20 @@ static void flush_list (int m, int n)
|
|||||||
code_byte(n);
|
code_byte(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_localvar (TreeNode *name)
|
|
||||||
{
|
|
||||||
if (nlocalvar < MAXLOCALS)
|
|
||||||
localvar[nlocalvar++] = name;
|
|
||||||
else
|
|
||||||
yyerror ("too many local variables");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void store_localvar (TreeNode *name, int n)
|
static void store_localvar (TreeNode *name, int n)
|
||||||
{
|
{
|
||||||
if (nlocalvar+n < MAXLOCALS)
|
if (nlocalvar+n < MAXLOCALS)
|
||||||
localvar[nlocalvar+n] = name;
|
localvar[nlocalvar+n] = name;
|
||||||
else
|
else
|
||||||
yyerror ("too many local variables");
|
yyerror ("too many local variables");
|
||||||
|
if (lua_debug)
|
||||||
|
luaI_registerlocalvar(name, lua_linenumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void add_localvar (TreeNode *name)
|
||||||
|
{
|
||||||
|
store_localvar(name, 0);
|
||||||
|
nlocalvar++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_varbuffer (Long var)
|
static void add_varbuffer (Long var)
|
||||||
@@ -391,7 +393,6 @@ static void codeIf (Long thenAdd, Long elseAdd)
|
|||||||
*/
|
*/
|
||||||
void lua_parse (TFunc *tf)
|
void lua_parse (TFunc *tf)
|
||||||
{
|
{
|
||||||
lua_debug = 0;
|
|
||||||
initcode = &(tf->code);
|
initcode = &(tf->code);
|
||||||
*initcode = newvector(CODE_BLOCK, Byte);
|
*initcode = newvector(CODE_BLOCK, Byte);
|
||||||
maincode = 0;
|
maincode = 0;
|
||||||
@@ -492,11 +493,14 @@ body : '(' parlist ')' block END
|
|||||||
{
|
{
|
||||||
codereturn();
|
codereturn();
|
||||||
$$ = new(TFunc);
|
$$ = new(TFunc);
|
||||||
|
luaI_initTFunc($$);
|
||||||
$$->size = pc;
|
$$->size = pc;
|
||||||
$$->code = newvector(pc, Byte);
|
$$->code = newvector(pc, Byte);
|
||||||
$$->fileName = lua_parsedfile;
|
$$->fileName = lua_parsedfile;
|
||||||
$$->lineDefined = $2;
|
$$->lineDefined = $2;
|
||||||
memcpy($$->code, basepc, pc*sizeof(Byte));
|
memcpy($$->code, basepc, pc*sizeof(Byte));
|
||||||
|
if (lua_debug)
|
||||||
|
luaI_closelocalvars($$);
|
||||||
/* save func values */
|
/* save func values */
|
||||||
funcCode = basepc; maxcode=maxcurr;
|
funcCode = basepc; maxcode=maxcurr;
|
||||||
#if LISTING
|
#if LISTING
|
||||||
@@ -557,7 +561,11 @@ block : {$<vInt>$ = nlocalvar;} statlist ret
|
|||||||
{
|
{
|
||||||
if (nlocalvar != $<vInt>1)
|
if (nlocalvar != $<vInt>1)
|
||||||
{
|
{
|
||||||
nlocalvar = $<vInt>1;
|
if (lua_debug)
|
||||||
|
for (; nlocalvar > $<vInt>1; nlocalvar--)
|
||||||
|
luaI_unregisterlocalvar(lua_linenumber);
|
||||||
|
else
|
||||||
|
nlocalvar = $<vInt>1;
|
||||||
lua_codeadjust (0);
|
lua_codeadjust (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
** LUA - Linguagem para Usuarios de Aplicacao
|
** LUA - Linguagem para Usuarios de Aplicacao
|
||||||
** Grupo de Tecnologia em Computacao Grafica
|
** Grupo de Tecnologia em Computacao Grafica
|
||||||
** TeCGraf - PUC-Rio
|
** TeCGraf - PUC-Rio
|
||||||
** $Id: luadebug.h,v 1.2 1995/10/26 14:21:56 roberto Exp $
|
** $Id: luadebug.h,v 1.3 1996/01/09 20:22:44 roberto Exp roberto $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -14,11 +14,16 @@
|
|||||||
typedef void (*lua_LHFunction) (int line);
|
typedef void (*lua_LHFunction) (int line);
|
||||||
typedef void (*lua_CHFunction) (lua_Object func, char *file, int line);
|
typedef void (*lua_CHFunction) (lua_Object func, char *file, int line);
|
||||||
|
|
||||||
lua_Object lua_stackedfunction(int level);
|
lua_Object lua_stackedfunction (int level);
|
||||||
void lua_funcinfo (lua_Object func, char **filename, int *linedefined);
|
void lua_funcinfo (lua_Object func, char **filename, int *linedefined);
|
||||||
int lua_currentline (lua_Object func);
|
int lua_currentline (lua_Object func);
|
||||||
char *lua_getobjname (lua_Object o, char **name);
|
char *lua_getobjname (lua_Object o, char **name);
|
||||||
lua_LHFunction lua_setlinehook (lua_LHFunction hook);
|
lua_LHFunction lua_setlinehook (lua_LHFunction hook);
|
||||||
lua_CHFunction lua_setcallhook (lua_CHFunction hook);
|
lua_CHFunction lua_setcallhook (lua_CHFunction hook);
|
||||||
|
|
||||||
|
lua_Object lua_getlocal (lua_Object func, int local_number, char **name);
|
||||||
|
int lua_setlocal (lua_Object func, int local_number);
|
||||||
|
|
||||||
|
extern int lua_debug;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
37
opcode.c
37
opcode.c
@@ -3,7 +3,7 @@
|
|||||||
** TecCGraf - PUC-Rio
|
** TecCGraf - PUC-Rio
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *rcs_opcode="$Id: opcode.c,v 3.53 1996/01/23 18:43:07 roberto Exp roberto $";
|
char *rcs_opcode="$Id: opcode.c,v 3.54 1996/01/30 15:25:23 roberto Exp roberto $";
|
||||||
|
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -441,6 +441,38 @@ int lua_currentline (lua_Object func)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
lua_Object lua_getlocal (lua_Object func, int local_number, char **name)
|
||||||
|
{
|
||||||
|
Object *f = luaI_Address(func);
|
||||||
|
*name = luaI_getlocalname(f->value.tf, local_number, lua_currentline(func));
|
||||||
|
if (*name)
|
||||||
|
{
|
||||||
|
/* if "*name", there must be a LUA_T_LINE */
|
||||||
|
/* therefore, f+2 points to function base */
|
||||||
|
return Ref((f+2)+(local_number-1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return LUA_NOOBJECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lua_setlocal (lua_Object func, int local_number)
|
||||||
|
{
|
||||||
|
Object *f = Address(func);
|
||||||
|
char *name = luaI_getlocalname(f->value.tf, local_number, lua_currentline(func));
|
||||||
|
adjustC(1);
|
||||||
|
--top;
|
||||||
|
if (name)
|
||||||
|
{
|
||||||
|
/* if "name", there must be a LUA_T_LINE */
|
||||||
|
/* therefore, f+2 points to function base */
|
||||||
|
*((f+2)+(local_number-1)) = *top;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Execute a protected call. Assumes that function is at CBase and
|
** Execute a protected call. Assumes that function is at CBase and
|
||||||
** parameters are on top of it. Leave nResults on the stack.
|
** parameters are on top of it. Leave nResults on the stack.
|
||||||
@@ -480,9 +512,8 @@ static int do_protectedmain (void)
|
|||||||
adjustC(1); /* one slot for the pseudo-function */
|
adjustC(1); /* one slot for the pseudo-function */
|
||||||
stack[CBase].tag = LUA_T_FUNCTION;
|
stack[CBase].tag = LUA_T_FUNCTION;
|
||||||
stack[CBase].value.tf = &tf;
|
stack[CBase].value.tf = &tf;
|
||||||
tf.lineDefined = 0;
|
luaI_initTFunc(&tf);
|
||||||
tf.fileName = lua_parsedfile;
|
tf.fileName = lua_parsedfile;
|
||||||
tf.code = NULL;
|
|
||||||
if (setjmp(myErrorJmp) == 0)
|
if (setjmp(myErrorJmp) == 0)
|
||||||
{
|
{
|
||||||
lua_parse(&tf);
|
lua_parse(&tf);
|
||||||
|
|||||||
Reference in New Issue
Block a user