|
@@ -6,9 +6,24 @@
|
|
|
#include "func.h"
|
|
|
#include "opcode.h"
|
|
|
|
|
|
+#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
|
|
|
*/
|
|
@@ -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;
|
|
|
+}
|
|
|
+
|