diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-02-07 16:10:27 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-02-07 16:10:27 -0200 |
| commit | 5a3a1fe458a7eab402f5386e4dcb8282c94ff068 (patch) | |
| tree | fc315159d0b00d3e726c0a538e40b6acdaa3e013 /func.c | |
| parent | 56fb06b6f5eaea4f3dba32af1cc476a99b678497 (diff) | |
| download | lua-5a3a1fe458a7eab402f5386e4dcb8282c94ff068.tar.gz lua-5a3a1fe458a7eab402f5386e4dcb8282c94ff068.tar.bz2 lua-5a3a1fe458a7eab402f5386e4dcb8282c94ff068.zip | |
debug interface functions to manipulated local variables:
"lua_getlocal" and "lua_setlocal".
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 | |||
