diff options
Diffstat (limited to 'func.c')
-rw-r--r-- | func.c | 82 |
1 files changed, 82 insertions, 0 deletions
@@ -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 | |||
9 | static TFunc *function_root = NULL; | 11 | static TFunc *function_root = NULL; |
12 | static LocVar *currvars = NULL; | ||
13 | static int numcurrvars = 0; | ||
14 | static int maxcurrvars = 0; | ||
10 | 15 | ||
11 | 16 | ||
12 | /* | 17 | /* |
18 | ** Initialize TFunc struct | ||
19 | */ | ||
20 | void 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 | */ |
15 | void luaI_insertfunction (TFunc *f) | 30 | void 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 | */ | ||
98 | void 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 | */ | ||
119 | void 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 | */ | ||
128 | void 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 | */ | ||
141 | char *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 | |||