aboutsummaryrefslogtreecommitdiff
path: root/func.c
diff options
context:
space:
mode:
Diffstat (limited to 'func.c')
-rw-r--r--func.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/func.c b/func.c
index 2982f661..17bc0242 100644
--- a/func.c
+++ b/func.c
@@ -6,10 +6,25 @@
6#include "func.h" 6#include "func.h"
7#include "opcode.h" 7#include "opcode.h"
8 8
9#define LOCALVARINITSIZE 10
10
9static TFunc *function_root = NULL; 11static TFunc *function_root = NULL;
12static LocVar *currvars = NULL;
13static int numcurrvars = 0;
14static int maxcurrvars = 0;
10 15
11 16
12/* 17/*
18** Initialize TFunc struct
19*/
20void luaI_initTFunc (TFunc *f)
21{
22 f->code = NULL;
23 f->lineDefined = 0;
24 f->locvars = NULL;
25}
26
27/*
13** Insert function in list for GC 28** Insert function in list for GC
14*/ 29*/
15void luaI_insertfunction (TFunc *f) 30void luaI_insertfunction (TFunc *f)
@@ -77,3 +92,70 @@ void lua_funcinfo (lua_Object func, char **filename, int *linedefined)
77 } 92 }
78} 93}
79 94
95/*
96** Stores information to know that variable has been declared in given line
97*/
98void luaI_registerlocalvar (TreeNode *varname, int line)
99{
100 if (numcurrvars >= maxcurrvars)
101 if (currvars == NULL)
102 {
103 maxcurrvars = LOCALVARINITSIZE;
104 currvars = newvector (maxcurrvars, LocVar);
105 }
106 else
107 {
108 maxcurrvars *= 2;
109 currvars = growvector (currvars, maxcurrvars, LocVar);
110 }
111 currvars[numcurrvars].varname = varname;
112 currvars[numcurrvars].line = line;
113 numcurrvars++;
114}
115
116/*
117** Stores information to know that variable has been out of scope in given line
118*/
119void luaI_unregisterlocalvar (int line)
120{
121 luaI_registerlocalvar(NULL, line);
122}
123
124/*
125** Copies "currvars" into a new area and store it in function header.
126** The values (varname = NULL, line = -1) signal the end of vector.
127*/
128void luaI_closelocalvars (TFunc *func)
129{
130 func->locvars = newvector (numcurrvars+1, LocVar);
131 memcpy (func->locvars, currvars, numcurrvars*sizeof(LocVar));
132 func->locvars[numcurrvars].varname = NULL;
133 func->locvars[numcurrvars].line = -1;
134 numcurrvars = 0; /* prepares for next function */
135}
136
137/*
138** Look for n-esim local variable at line "line" in function "func".
139** Returns NULL if not found.
140*/
141char *luaI_getlocalname (TFunc *func, int local_number, int line)
142{
143 int count = 0;
144 char *varname = NULL;
145 LocVar *lv = func->locvars;
146 if (lv == NULL)
147 return NULL;
148 for (; lv->line != -1 && lv->line < line; lv++)
149 {
150 if (lv->varname) /* register */
151 {
152 if (++count == local_number)
153 varname = lv->varname->ts.str;
154 }
155 else /* unregister */
156 if (--count < local_number)
157 varname = NULL;
158 }
159 return varname;
160}
161